如何将字符数组转换回字符串?

446

我有一个字符数组:

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

我的当前解决方案是执行

String b = new String(a);

但肯定有更好的方法吧?


173
你为什么认为有更好的方式?不要叫我谢莉。 :) - Hovercraft Full Of Eels
1
因为我总是认为像上面这样创建新变量在运行时会有一些额外的开销。比如,如果我将上述代码行用于将字符数组转换为字符串,并将其放入for循环中,对我来说看起来不太对劲。是的,我有点完美主义…… - chutsu
2
如果你有很多这些字符,比如一个char[]的数组或集合,那么也许你会将这些char数组附加到StringBuffer中,但对于偶尔出现的字符串,大多数人使用你发布的方法。 - Hovercraft Full Of Eels
14
“创建新变量”不会产生任何额外负担。 变量是用于引用值的名称,名称本身在运行时(至少在像Java这样反射相对有限的语言中)并不存在于内存中。 “负担”来自于构造一个新的,考虑到您的问题是“构造此值”,在此情况下无法避免。 您不能使字符数组神奇地转化为字符串。 您可以安排在创建字符串后原始字符数组被垃圾回收。 - Karl Knechtel
在您的示例中使用String构造函数意味着字符串对象不会在字符串池中。 - Ammar Samater
显示剩余2条评论
14个回答

230

不,那个解决方案是完全正确且非常简洁的。

但请注意,这是一个非常不寻常的情况:因为在Java中,String被特殊处理,即使是"foo"也实际上是一个String。因此,在正常代码中不需要将字符串拆分为单个char并将它们连接起来。

与C/C++相比,"foo"在一侧是由零字节终止的一组char,在另一侧是string,由于遗留方法而存在许多转换。


157

String text = String.copyValueOf(data);

或者

String text = String.valueOf(data);

可以说是更好的选择(封装了new String调用)。


7
两种方法都调用了String(char[])或其变体。而复制的部分是在String(char[])内完成的。因此,与其他valueOf方法保持对称性以外,直接调用没有任何好处。 - A.H.
1
“_static_”和“更多的OOP”是相互矛盾的。任何声明为“_static_”的内容都不是对象或其行为的一部分,因此不是面向对象的。除此之外——如果有任何可能会以不兼容的方式改变和/或增强String的实现,或者可以在运行时选择多个竞争实现,则使用静态工厂方法是有意义的。这种情况不会发生在像String这样的低级别事物上。因此,我的前提是:使用最小的合适的工具,而不是可用的最大的工具。 - A.H.
@A.H. 我不清楚那个。String被StringBuffer所取代,而后者又被StringBuilder所取代。我敢打赌,当时支持StringBuffer的人也说了同样的话,现在他们必须重构代码以使用StringBuilder。 - corsiKa
1
@A.H. 他们不得不创建CharSequence接口的事实表明了你所说的“像字符串这样的低级东西不会发生这种情况”的缺陷 - 他们没有改变字符串中发生的事情,因为他们早期就与之绑定,现在他们希望他们不会这样做。 - corsiKa
1
@corsiKa 我并没有说 String API 是完美无缺的。只是它不会以不兼容的方式进行更改,而且该类本身及其构造函数也不会消失。 :-) - A.H.
显示剩余2条评论

39

这将把字符数组转换回字符串:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);

22
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

现在要将字符数组转换为字符串,有两种方法。

Arrays.toString(c);

返回字符串[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]

还有:

String.valueOf(c)

返回字符串wwwwww3333dfevvv

总结:注意Arrays.toString(c),因为你会得到"[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"而不是"wwwwww3333dfevvv"


9
在Java中,字符串只是一个围绕字符数组的对象。因此,一个
char[]

与具有相同字符的非装箱字符串相同。 通过从您的字符数组创建一个新的字符串

new String(char[])

你基本上是在告诉编译器在字符数组周围自动装箱一个字符串对象。


4
只需要像下面这样使用String.valueOf方法:
  private static void h() {

        String helloWorld = "helloWorld";
        System.out.println(helloWorld);

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }

2
package naresh.java;

public class TestDoubleString {

    public static void main(String args[]){
        String str="abbcccddef";    
        char charArray[]=str.toCharArray();
        int len=charArray.length;

        for(int i=0;i<len;i++){
            //if i th one and i+1 th character are same then update the charArray
            try{
                if(charArray[i]==charArray[i+1]){
                    charArray[i]='0';                   
                }}
                catch(Exception e){
                    System.out.println("Exception");
                }
        }//finally printing final character string
        for(int k=0;k<charArray.length;k++){
            if(charArray[k]!='0'){
                System.out.println(charArray[k]);
            }       }
    }
}

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - baikho

1

尝试使用java.util.Arrays。此模块具有多种与数组相关的有用方法。

Arrays.toString(your_array_here[]);

1
 //Given Character Array 
  char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};


    //Converting Character Array to String using String funtion     
    System.out.println(String.valueOf(a));
    //OUTPUT : hello world

使用Java 8 Stream函数将任何给定的数组类型转换为字符串
String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

-1

试试这个

Arrays.toString(array)

Arrays.toString(new char[] {'a', 'b', 'c'}) 返回 "[a, b, c]"; 而不是 "abc"。 - Prasad Karunagoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接