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


405

我有一个char数组:

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

我目前的解决方案是

String b = new String(a);

但是肯定有更好的方法吗?


151
为什么认为有更好的方法?而且不要叫我雪莉。:)
气垫船充满鳗鱼,

因为我总是将诸如上述的新变量关联起来,以在运行时稍微增加一些开销。例如,如果我将上面的代码行将char数组转换为字符串并转换为for循环,对我而言,它看起来并不正确。是的,我有点完美主义者。。。
chutsu 2011年

1
如果您有很多这样的人,比如说char []的数组或集合,那么也许您可以将char数组附加到StringBuffer上,但是对于此处或此处的String,您发布的内容是最有用的。
气垫船充满鳗鱼,

如果您正在寻找一种避免复制char []的方法,那么没有办法了。否则,您可能会破坏String的不变性。
Paul Cager 2011年

13
“制作新变量”的开销为零。变量是一个用于引用值的名称,并且名称本身在运行时在内存中不存在(至少不是像Java这样反射受限的语言)。“开销”来自于构造一个新的,并且在您的情况下,考虑到您的问题是“构造该值”,没有办法解决。您不能使char数组神奇地迁移为String。您可以安排在创建字符串之后原有的字符数组是垃圾收集。
Karl Knechtel

Answers:


212

不,该解决方案是绝对正确的,而且非常少。

但是请注意,这是一种非常不寻常的情况:因为String是在Java中专门处理的,所以"foo"实际上甚至是一个String。因此,char在普通代码中不需要将String拆分为单个s并将其重新连接。

将此与C / C ++进行比较,在C / C ++中,"foo"您的chars 捆绑在一侧和string另一侧以零字节结尾,并且由于传统方法而在它们之间进行了许多转换。


146

String text = String.copyValueOf(data);

要么

String text = String.valueOf(data);

可以说更好(封装了new String调用)。


6
两种方法都调用String(char[])或对其进行变体。复制部分在内部完成String(char[])。除了与其他valueOf方法对称之外,这对直接调用没有任何好处。
AH

1
静态更多的面向对象操作是术语的矛盾。任何声明为static的东西都不是对象或其行为的一部分,因此也不是面向对象的。除此之外-如果将有可能String以不兼容的方式更改和/或增强其实现,或者在运行时可以选择几个相互竞争的实现,则使用静态工厂方法是有意义的。像这样低级的事情不会发生String。因此,我的前提是:使用最小的锤子,而不是最大的锤子。
AH

@AH我不知道。字符串让位给StringBuffer,而StringBuffer让位给StringBuilder。我打赌StringBuffer的支持者也说了同样的话,现在必须重构代码才能使用StringBuilder。
corsiKa 2013年

1
@AH他们必须创建CharSequence接口的事实表明,您的“不会在字符串之类的低级内容上发生错误”的缺点是-他们不会更改字符串中发生的事情,因为他们很早就绑定了字符串,现在他们希望他们没有。
corsiKa 2013年

1
@corsiKa我没有说过,String API很好而且很黄金。只是它不会以不兼容的方式进行更改,并且类本身及其构造函数不会随处可见。:-)
AH

37

这会将char数组转换回字符串:

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

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

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

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"


7

Java中的String仅仅是围绕char数组的对象。因此

char[]

与具有相同字符的未装箱的String相同。通过从字符数组创建新的字符串

new String(char[])

实际上,您是在告诉编译器在字符数组周围自动装箱String对象。



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
 //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函数将任何给定的Array类型转换为String

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

1

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

Arrays.toString(your_array_here[]);


0

只需使用如下的String.value即可;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

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

-3

尝试这个:

CharSequence[] charArray = {"a","b","c"};

for (int i = 0; i < charArray.length; i++){
    String str = charArray.toString().join("", charArray[i]);
    System.out.print(str);
}


-12

1种替代方法是:

String b = a + "";

3
这是错误的,因为它假定toString可以正常工作char[]。它可能适用于某些特定的供应商和JVM版本。
fommil 2014年

3
由于String类是不可变的,因此将导致执行两个操作:toString()调用a并创建另一个与a.toString()和连接的String对象""
Alpay 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.