在Java中将字符串数组转换为字符串

Pri*_*raj 218 java arrays string

我想要Java代码将字符串数组转换为字符串.

Mic*_*rry 438

如果您只想要一个数组的"调试样式"转储:

String str = Arrays.toString(arr);
Run Code Online (Sandbox Code Playgroud)

或者,为了更多控制(在Java 8之前):

StringBuilder builder = new StringBuilder();
for(String s : arr) {
    builder.append(s);
}
String str = builder.toString();
Run Code Online (Sandbox Code Playgroud)

(Java 8及以上版本):

String str = String.join(",", arr);
Run Code Online (Sandbox Code Playgroud)

您可以根据字符串之间的字符数(如果有)修改上述内容.

您可能会看到与Java 8之前的代码几乎相同的代码,但使用StringBuffer- StringBuilder是一个不是线程安全的新类,但因此它在单个线程中具有更好的性能,因为它消除了不需要的同步.简而言之,StringBuilder在99%的情况下你最好使用- 功能明智,两者是相同的.

不要使用字符串,只需附加+ =,就像这里显示的一些答案一样.这会将GC发送到屋顶,因为您正在创建并丢弃与阵列中的项目一样多的字符串对象.对于小型阵列,您可能没有真正注意到差异,但对于大型阵列,它可能会慢几个数量级.

  • 感谢您解释为什么StringBuilder优于+ =进行追加. (13认同)
  • @matteo,你必须使用`Arrays.toString(yourArray);`但我想你使用了'yourArray.toString();` (6认同)
  • 因为java```1.8```你也可以使用[```String :: join```](https://docs.oracle.com/javase/8/docs/api/java/lang/String. html #join-java.lang.CharSequence-java.lang.CharSequence ...-),而不是for-loop.```String.join("",arr);``` (5认同)
  • 如果你在封面下使用+ =,Java会将其转换为使用StringBuilder. (4认同)
  • 我可以建议“要么使用 Array.toString()”部分。这会产生无用的输出,例如“[Ljava.lang.String;@25154f”。 (2认同)
  • Android开发人员可以使用String result = TextUtils.join(",",list); /sf/ask/2366208001/ (2认同)

kro*_*ock 102

使用Apache公共StringUtils.join().它接受一个数组,作为参数(并且还具有重载IterableIterator参数),并调用toString()每个元素(如果它不为null)以获取每个元素字符串表示.然后将每个元素字符串表示连接成一个字符串,如果指定了一个字符串,则在它们之间:

String joinedString = StringUtils.join(new Object[]{"a", "b", 1}, "-");
System.out.println(joinedString);
Run Code Online (Sandbox Code Playgroud)

生产:

a-b-1
Run Code Online (Sandbox Code Playgroud)


ric*_*ich 35

我喜欢使用Google的Guava Joiner,例如:

Joiner.on(", ").skipNulls().join("Harry", null, "Ron", "Hermione");
Run Code Online (Sandbox Code Playgroud)

将生成相同的字符串:

new String("Harry, Ron, Hermione");
Run Code Online (Sandbox Code Playgroud)

ETA:Java 8现在有类似的支持:

String.join(", ", "Harry", "Ron", "Hermione");
Run Code Online (Sandbox Code Playgroud)

看不到跳过空值的支持,但这很容易解决.

  • 如果你很勇敢:;-)`Joiner.on(",").useForNull("Voldemort").join("Harry",null,"Ron","Hermione"); (22认同)
  • 但如果我们对情节忠诚,那么`null`就是"他的名字一定不能被提及":-) (10认同)
  • Voldemort取代null? (4认同)

Joe*_*lav 13

你可以这样做,给定一个a基本类型的数组:

StringBuffer result = new StringBuffer();
for (int i = 0; i < a.length; i++) {
   result.append( a[i] );
   //result.append( optional separator );
}
String mynewstring = result.toString();
Run Code Online (Sandbox Code Playgroud)

  • StringBuffer是旧的,使用StringBuilder而不是在一个线程中使用不需要的同步. (22认同)

Mid*_*rse 13

从Java 8开始,我认为最简单的方法是:

    String[] array = { "cat", "mouse" };
    String delimiter = "";
    String result = String.join(delimiter, array);
Run Code Online (Sandbox Code Playgroud)

这样您就可以选择任意分隔符.


SAN*_*NN3 9

尝试使用Arrays.deepToString方法.

返回指定数组的"深层内容"的字符串表示形式.如果数组包含其他数组作为元素,则字符串表示包含其内容,依此类推.此方法用于将多维数组转换为字符串


ada*_*shr 7

尝试使用Arrays.toString重载方法.

或者,尝试以下通用实现:

public static void main(String... args) throws Exception {

    String[] array = {"ABC", "XYZ", "PQR"};

    System.out.println(new Test().join(array, ", "));
}

public <T> String join(T[] array, String cement) {
    StringBuilder builder = new StringBuilder();

    if(array == null || array.length == 0) {
        return null;
    }

    for (T t : array) {
        builder.append(t).append(cement);
    }

    builder.delete(builder.length() - cement.length(), builder.length());

    return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)