¿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.
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:
package naresh.java;publicclassTestDoubleString{publicstaticvoid 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 charArraytry{if(charArray[i]==charArray[i+1]){
charArray[i]='0';}}catch(Exception e){System.out.println("Exception");}}//finally printing final character stringfor(int k=0;k<charArray.length;k++){if(charArray[k]!='0'){System.out.println(charArray[k]);}}}}
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
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""
Respuestas:
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
String
se maneja especialmente en Java, incluso en"foo"
realidad es unString
. Por lo tanto, la necesidad de dividir una Cadena enchar
s individuales y unirlas de nuevo no se requiere en el código normal.Compare esto con C / C ++ donde
"foo"
tiene un paquete dechar
s terminado por un byte cero en un lado ystring
en el otro lado y muchas conversiones entre ellos debido a métodos heredados.fuente
String text = String.copyValueOf(data);
o
String text = String.valueOf(data);
es posiblemente mejor (encapsula la
new String
llamada).fuente
String(char[])
o una variante de eso. Y la parte de la copia se hace adentroString(char[])
. Esto no deja ningún beneficio a una llamada directa además de la simetría con los otrosvalueOf
métodos.String
se 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 comoString
. Por lo tanto, mi premisa es: usar el martillo más pequeño adecuado, no el más grande disponible.CharSequence
interfaz 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.Esto convertirá la matriz de caracteres de nuevo a cadena:
fuente
Ahora para convertir la matriz de caracteres en String, hay dos formas.
Devuelve la cadena
[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]
.Y:
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"
.fuente
Una cadena en java es simplemente un objeto alrededor de una serie de caracteres. De ahí un
es idéntico a una cadena sin caja con los mismos caracteres. Al crear una nueva cadena a partir de su conjunto de caracteres
esencialmente le está diciendo al compilador que autoboxbox un objeto String alrededor de su matriz de caracteres.
fuente
Puedes usar el
String.valueOf
método.Por ejemplo,
Para obtener más información sobre la matriz de caracteres a la cadena, puede consultar los enlaces a continuación
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
https://www.flowerbrackets.com/convert-char-array-to-string-java/
fuente
fuente
Convertir cualquier tipo de matriz a String usando la función Java 8 Stream
fuente
Intenta usar
java.util.Arrays
. Este módulo tiene una variedad de métodos útiles que podrían usarse relacionados con matrices.fuente
Prueba esto
fuente
Simplemente use String.value como el siguiente;
fuente
Prueba esto:
fuente
También puedes usar la clase StringBuilder
El uso de String o StringBuilder varía con los requisitos de su método.
fuente
Una forma alternativa es hacer:
fuente
toString
funciona correctamentechar[]
. Podría funcionar en algunos proveedores específicos y versiones de la JVM.a
y crear otro objeto String que se concatene cona.toString()
y""