Como converter uma matriz de caracteres de volta em uma string?


405

Eu tenho uma matriz de caracteres:

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

Minha solução atual é fazer

String b = new String(a);

Mas certamente há uma maneira melhor de fazer isso?


151
Por que acha que existe uma maneira melhor? E não me chame de Shirley. :)
Hovercraft Cheio De Enguias

Porque eu sempre associo a criação de novas variáveis, como a acima, para ter uma leve sobrecarga durante o tempo de execução. Como se eu colocasse a linha acima para converter uma matriz de caracteres em uma string em um loop for, por exemplo, para mim, isso não parece certo. E sim, sou um pouco perfeccionista. . .
chutsu 4/10/11

11
Se você tem muitos desses caras, digamos, uma matriz ou coleção de char [], talvez seja possível anexar as matrizes de char a um StringBuffer, mas para uma String aqui ou ali, o que você postou é o que mais usa.
Hovercraft Cheio De Enguias

Se você está procurando uma maneira de evitar copiar o char [], não há uma. Caso contrário, você pode subverter a imutabilidade de String.
Paul Cager 4/10

13
"criar novas variáveis" incorre em zero de sobrecarga. Uma variável é um nome usado para se referir a um valor, e o próprio nome não está presente em nenhum lugar da memória no tempo de execução (pelo menos, não em uma linguagem como Java, onde a reflexão é bastante limitada). A "sobrecarga" vem da construção de um novo valor , e não há como contornar isso no seu caso, considerando que o seu problema é "construir esse valor". Você não pode fazer com que o array char se transmogrifique magicamente em uma String. Você pode organizar para que a matriz de caracteres original seja coletada como lixo após a criação da String.
Karl Knechtel

Respostas:


212

Não, essa solução é absolutamente correta e muito mínima.

Observe, no entanto, que esta é uma situação muito incomum: como Stringé tratado especialmente em Java, mesmo "foo"é na verdade um String. Portanto, a necessidade de dividir uma String em chars individuais e juntá-las novamente não é necessária no código normal.

Compare isso com o C / C ++, onde "foo"você tem um pacote de chars terminado por um byte zero de um lado e stringdo outro lado e muitas conversões entre eles devido a métodos legados.


146

String text = String.copyValueOf(data);

ou

String text = String.valueOf(data);

é sem dúvida melhor (encapsula a new Stringchamada).


6
Ambos os métodos chamam String(char[])ou uma variante disso. E a parte da cópia é feita dentro String(char[]). Isso não deixa nenhum benefício para uma chamada direta, além da simetria com os outros valueOfmétodos.
AH

11
estático e mais OOP é uma contradição de termos. Qualquer coisa declarada estática não faz parte de um objeto ou de seu comportamento e, portanto, não é orientada a objetos. Além disso - se houver alguma chance de que a implementação de Stringseja alterada e / ou aprimorada de maneira incompatível ou que várias implementações concorrentes possam ser escolhidas em tempo de execução, um método estático de fábrica faz sentido. Isso não acontecerá com um nível tão baixo como String. Portanto, minha premissa é: Use o menor martelo adequado, não o maior disponível.
AH

@ Ah, eu não sei sobre isso. String deu lugar a StringBuffer, que deu lugar a StringBuilder. Aposto que os defensores do StringBuffer disseram a mesma coisa então e agora precisam refatorar o código para usar o StringBuilder.
corsiKa

11
@AH O fato de eles terem que criar a CharSequenceinterface mostra o quão falho é o seu "não acontecerá com coisas de baixo nível como string" - eles não mudam o que acontece na string porque se ligaram a ela desde o início e agora desejam eles não teriam.
corsiKa

11
@corsiKa Eu não disse que a API String é tudo de bom e de ouro. Só que isso não mudará de maneira incompatível e que a própria classe e seus construtores não irão a lugar algum. :-)
AH

37

Isso converterá o array char novamente em string:

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

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

Agora, para converter a matriz de caracteres em String, existem duas maneiras.

Arrays.toString(c);

Retorna a string [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

E:

String.valueOf(c)

Retorna a string wwwwww3333dfevvv.

Em resumo : preste atenção Arrays.toString(c), porque você receberá em "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"vez de "wwwwww3333dfevvv".


7

Uma String em java é apenas um objeto em torno de uma matriz de caracteres. Portanto, um

char[]

é idêntico a uma String sem caixa com os mesmos caracteres. Criando uma nova String a partir de sua matriz de caracteres

new String(char[])

você está basicamente dizendo ao compilador para autobox um objeto String em torno de sua matriz de caracteres.



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

Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
precisa saber é o seguinte

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

Convertendo qualquer tipo de matriz em String usando a função Java 8 Stream

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

1

Tente usar java.util.Arrays. Este módulo possui uma variedade de métodos úteis que podem ser usados ​​relacionados a Matrizes.

Arrays.toString(your_array_here[]);


0

Basta usar String.value como abaixo;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

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

-3

Tente o seguinte:

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

Você também pode usar a classe StringBuilder

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

O uso de String ou StringBuilder varia de acordo com os requisitos do seu método.


Porquê? O que você ganha fazendo isso?
Casey

-12

Uma maneira alternativa é fazer:

String b = a + "";

3
isso está errado, pois assume que toStringfunciona corretamente char[]. Pode funcionar em alguns fornecedores e versões específicos da JVM.
fommil

3
Porque a classe String é imutável, isso fará com que duas operações a serem realizadas: toString () chamada no ae criação de outro objeto String que concatena com a.toString()e""
Alpay
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.