Làm thế nào để chuyển đổi một mảng char trở lại một chuỗi?


405

Tôi có một mảng char:

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

Giải pháp hiện tại của tôi là làm

String b = new String(a);

Nhưng chắc chắn có một cách tốt hơn để làm điều này?


151
Tại sao nghĩ rằng có một cách tốt hơn? Và đừng gọi tôi là Shirley. :)
Hovercraft Full Of Eels

Bởi vì tôi luôn liên kết việc tạo các biến mới như ở trên để có một chút vượt trội trong thời gian chạy. Giống như nếu tôi đặt dòng trên để chuyển đổi một mảng char thành một chuỗi thành một vòng lặp for chẳng hạn, với tôi nó không hoàn toàn đúng. Và vâng tôi là một người cầu toàn. . .
chutsu

1
Nếu bạn có nhiều người như vậy, giả sử một mảng hoặc bộ sưu tập char [], thì có lẽ bạn sẽ nối các mảng char vào StringBuffer, nhưng đối với String ở đây hoặc ở đó, những gì bạn đã đăng là thứ được sử dụng nhiều nhất.
Hovercraft Full Of Eels

Nếu bạn đang tìm cách để tránh sao chép char [] thì không có cách nào. Nếu không, bạn có thể lật đổ tính bất biến của String.
Paul Cager

13
"Làm biến mới" không phát sinh chi phí. Biến là một tên được sử dụng để chỉ một giá trị và bản thân tên đó không xuất hiện ở bất cứ đâu trong bộ nhớ khi chạy (ít nhất, không phải trong một ngôn ngữ như Java nơi sự phản chiếu khá hạn chế). "Chi phí chung" xuất phát từ việc xây dựng một giá trị mới và không có cách nào khác trong trường hợp của bạn, xem xét rằng vấn đề của bạn là "xây dựng giá trị này". Bạn không thể khiến mảng char truyền tín hiệu một cách kỳ diệu vào Chuỗi. Bạn có thể sắp xếp để mảng char ban đầu được thu gom rác sau khi Chuỗi được tạo.
Karl Knechtel

Câu trả lời:


212

Không, giải pháp đó là hoàn toàn chính xác và rất tối thiểu.

Tuy nhiên, lưu ý rằng đây là một tình huống rất bất thường: Bởi vì Stringđược xử lý đặc biệt trong Java, thậm chí "foo"thực sự là một String. Vì vậy, nhu cầu tách Chuỗi thành từng chars và nối lại chúng là không bắt buộc trong mã thông thường.

So sánh điều này với C / C ++ khi "foo"bạn có một bó chars bị chấm dứt bởi một byte 0 ở một bên và stringở phía bên kia và nhiều chuyển đổi giữa chúng do các phương thức kế thừa.


146

String text = String.copyValueOf(data);

hoặc là

String text = String.valueOf(data);

được cho là tốt hơn (đóng gói new Stringcuộc gọi).


6
Cả hai phương thức gọi String(char[])hoặc một biến thể của điều đó. Và phần sao chép được thực hiện bên trong String(char[]). Điều này không có lợi cho một cuộc gọi trực tiếp bên cạnh sự đối xứng với các valueOfphương thức khác .
AH

1
tĩnhnhiều OOP là một mâu thuẫn của các điều khoản. Bất cứ điều gì khai báo tĩnh không phải là một phần của một đối tượng hoặc hành vi của nó và do đó không hướng đối tượng. Bên cạnh đó - nếu có bất kỳ cơ hội nào thì việc triển khai Stringsẽ được thay đổi và / hoặc tăng cường theo cách không tương thích hoặc một số triển khai cạnh tranh có thể được chọn trong thời gian chạy, thì phương thức tĩnh nhà máy có ý nghĩa. Điều này sẽ không xảy ra với một thứ cấp thấp như vậy String. Do đó, tiền đề của tôi là: Sử dụng búa nhỏ nhất phù hợp, không phải là búa lớn nhất hiện có.
AH

@AH Tôi không biết về điều đó. String đã nhường chỗ cho StringBuffer đã nhường chỗ cho StringBuilder. Tôi cá là những người đề xướng StringBuffer đã nói điều tương tự sau đó, và bây giờ phải cấu trúc lại mã để sử dụng StringBuilder.
corsiKa

1
@AH Thực tế là họ phải tạo CharSequencegiao diện cho thấy mức độ "không xảy ra với các công cụ cấp thấp như chuỗi" của bạn - họ không thay đổi những gì diễn ra trong chuỗi vì họ tự gắn mình với nó từ sớm và bây giờ họ muốn họ sẽ không có.
corsiKa

1
@corsiKa Tôi không nói, API API hoàn toàn tốt và vàng. Chỉ có điều nó sẽ không thay đổi theo cách không tương thích và bản thân lớp và các nhà xây dựng của nó sẽ không đi đâu cả. :-)
AH

37

Điều này sẽ chuyển mảng char trở lại chuỗi:

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

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

Bây giờ để chuyển đổi mảng ký tự thành Chuỗi, có hai cách.

Arrays.toString(c);

Trả về chuỗi [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

Và:

String.valueOf(c)

Trả về chuỗi wwwwww3333dfevvv.

Tóm lại : chú ý đến Arrays.toString(c), bởi vì bạn sẽ nhận được "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"thay vì "wwwwww3333dfevvv".


7

Một chuỗi trong java chỉ là một đối tượng xung quanh một mảng ký tự. Do đó một

char[]

giống hệt với một Chuỗi không có hộp có cùng ký tự. Bằng cách tạo một Chuỗi mới từ mảng ký tự của bạn

new String(char[])

về cơ bản, bạn đang bảo trình biên dịch tự động hộp một đối tượng String xung quanh mảng ký tự của bạn.



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]);
            }       }
    }
}

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
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

Chuyển đổi bất kỳ loại Mảng đã cho nào thành Chuỗi bằng hàm Java 8 Stream

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

1

Cố gắng sử dụng java.util.Arrays. Mô-đun này có nhiều phương thức hữu ích có thể được sử dụng liên quan đến Mảng.

Arrays.toString(your_array_here[]);


0

Chỉ cần sử dụng String.value như dưới đây;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

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

-3

Thử cái này:

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

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

-4

Bạn cũng có thể sử dụng lớp StringBuilder

String b = new StringBuilder(a).toString();

Việc sử dụng String hoặc StringBuilder thay đổi theo yêu cầu phương thức của bạn.


Tại sao mặc dù? Bạn nhận được gì từ việc này?
Casey

-12

1 cách khác là làm:

String b = a + "";

3
Điều này là sai vì nó giả định rằng toStringhoạt động chính xác trên char[]. Nó có thể hoạt động trên một số nhà cung cấp và phiên bản cụ thể của JVM.
fommil

3
Vì lớp String là bất biến, điều này sẽ khiến hai thao tác được thực hiện: gọi toString () avà tạo một đối tượng Chuỗi khác nối với a.toString()""
Alpay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.