¿Cómo convertir una matriz de caracteres a una cadena?

405

Tengo una matriz de caracteres:

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

Mi solución actual es hacer

String b = new String(a);

¿Pero seguramente hay una mejor manera de hacer esto?

chutsu
fuente
151
¿Por qué crees que hay una mejor manera? Y no me llames Shirley. :)
Hovercraft Full Of Eels el
Porque siempre asocio la creación de nuevas variables como la anterior para tener una ligera sobrecarga durante el tiempo de ejecución. Por ejemplo, si pongo la línea anterior para convertir una matriz de caracteres en una cadena en un bucle for, no me parece del todo bien. Y sí, soy un poco perfeccionista. . .
chutsu
1
Si tiene muchos de estos tipos, digamos una matriz o colección de char [], entonces tal vez podría agregar las matrices de caracteres a un StringBuffer, pero para una cadena aquí o allá, lo que ha publicado es lo que más utiliza.
Hovercraft Full Of Eels el
Si está buscando una manera de evitar copiar el char [], entonces no hay una. De lo contrario, podría subvertir la inmutabilidad de String.
Paul Cager
13
"hacer nuevas variables" incurre en cero gastos generales. Una variable es un nombre utilizado para referirse a un valor, y el nombre en sí no está presente en ningún lugar de la memoria en tiempo de ejecución (al menos, no en un lenguaje como Java donde la reflexión es bastante limitada). La "sobrecarga" proviene de la construcción de un nuevo valor , y no hay forma de evitarlo en su caso, considerando que su problema es "construir este valor". No puede hacer que la matriz de caracteres se transfigura mágicamente en una Cadena. Puede hacer arreglos para que la matriz de caracteres original se recoja después de crear la Cadena.
Karl Knechtel

Respuestas:

212

No, esa solución es absolutamente correcta y muy mínima.

Sin embargo, tenga en cuenta que esta es una situación muy inusual: dado que Stringse maneja especialmente en Java, incluso en "foo"realidad es un String. Por lo tanto, la necesidad de dividir una Cadena en chars individuales y unirlas de nuevo no se requiere en el código normal.

Compare esto con C / C ++ donde "foo"tiene un paquete de chars terminado por un byte cero en un lado y stringen el otro lado y muchas conversiones entre ellos debido a métodos heredados.

AH
fuente
146

String text = String.copyValueOf(data);

o

String text = String.valueOf(data);

es posiblemente mejor (encapsula la new Stringllamada).

David Titarenco
fuente
66
Ambos métodos llaman String(char[])o una variante de eso. Y la parte de la copia se hace adentro String(char[]). Esto no deja ningún beneficio a una llamada directa además de la simetría con los otros valueOfmétodos.
AH
1
estática y más OOP es una contradicción de términos. Cualquier cosa declarada estática no es parte de un objeto o su comportamiento y, por lo tanto, no está orientada a objetos. Además de esto: si hubiera alguna posibilidad de que la implementación de Stringse cambie y / o mejore de manera incompatible o se puedan elegir varias implementaciones competidoras en tiempo de ejecución, entonces un método de fábrica estático tiene sentido. Esto no sucederá con un nivel tan bajo como String. Por lo tanto, mi premisa es: usar el martillo más pequeño adecuado, no el más grande disponible.
AH
@ Ah, no sé sobre eso. String dio paso a StringBuffer que dio paso a StringBuilder. Apuesto a que los proponentes de StringBuffer dijeron lo mismo entonces, y ahora tienen que refactorizar el código para usar StringBuilder.
corsiKa
1
@AH El hecho de que tuvieron que crear la CharSequenceinterfaz muestra cuán defectuoso es su "no sucederá con cosas de bajo nivel como una cadena": no cambian lo que sucede en la cadena porque se ataron a ella desde el principio, y ahora desean ellos no lo habrían hecho.
corsiKa
1
@corsiKa No dije que la cadena de API es buena y dorada. Solo que no cambiará de manera incompatible y que la clase misma y sus constructores no irán a ninguna parte. :-)
AH
37

Esto convertirá la matriz de caracteres de nuevo a cadena:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);
Billz
fuente
14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

Ahora para convertir la matriz de caracteres en String, hay dos formas.

Arrays.toString(c);

Devuelve la cadena [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

Y:

String.valueOf(c)

Devuelve la cadena wwwwww3333dfevvv.

En resumen : preste atención Arrays.toString(c), porque obtendrá en "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"lugar de "wwwwww3333dfevvv".

AalekhG
fuente
7

Una cadena en java es simplemente un objeto alrededor de una serie de caracteres. De ahí un

char[]

es idéntico a una cadena sin caja con los mismos caracteres. Al crear una nueva cadena a partir de su conjunto de caracteres

new String(char[])

esencialmente le está diciendo al compilador que autoboxbox un objeto String alrededor de su matriz de caracteres.

Nathan Meyer
fuente
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]);
            }       }
    }
}
Ramnaresh Mantri
fuente
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo responde la pregunta mejora su valor a largo plazo.
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

Convertir cualquier tipo de matriz a String usando la función Java 8 Stream

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

Intenta usar java.util.Arrays. Este módulo tiene una variedad de métodos útiles que podrían usarse relacionados con matrices.

Arrays.toString(your_array_here[]);
Adzz
fuente
0

Prueba esto

Arrays.toString(array)
Jessica Pereira
fuente
0

Simplemente use String.value como el siguiente;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }
Akash Yellappa
fuente
-3

Prueba esto:

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

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

También puedes usar la clase StringBuilder

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

El uso de String o StringBuilder varía con los requisitos de su método.

Jagmeet Singh
fuente
¿Por qué sin embargo? ¿Qué obtienes al hacer esto?
Casey
-12

Una forma alternativa es hacer:

String b = a + "";
Prasanna A
fuente
3
esto está mal, ya que supone que toStringfunciona correctamente char[]. Podría funcionar en algunos proveedores específicos y versiones de la JVM.
fommil
3
Debido a que la clase String es inmutable, esto hará que se realicen dos operaciones: invocar toString () ay crear otro objeto String que se concatene con a.toString()y""
Alpay