1. Introducción
Java String es una de las clases más importantes y ya hemos cubierto muchos de sus aspectos en nuestra serie de tutoriales relacionados con String .
En este tutorial, nos centraremos en la inicialización de cadenas en Java.
2. Creación
En primer lugar, debemos recordar cómo se crean las cadenas en Java.
Podemos usar la nueva palabra clave o la sintaxis literal:
String usingNew = new String("baeldung"); String usingLiteral = "baeldung";
Y también es importante que entendamos cómo se administran los String en un grupo especializado.
3. Declaración de cadena solamente
Primero, simplemente declaremos una cadena , sin asignar un valor explícitamente.
Podemos hacer esto localmente o como una variable miembro:
public class StringInitialization { String fieldString; void printDeclaredOnlyString() { String localVarString; // System.out.println(localVarString); -> compilation error System.out.println(fieldString); } }
Como podemos ver, si intentamos usar localVarString antes de darle un valor, obtendremos un error de compilación. Por otro lado, la consola mostrará " nulo" para el valor de fieldString .
Vea, las variables miembro se inicializan con un valor predeterminado cuando se construye la clase, nulo en el caso de String . Pero tenemos que inicializar las variables locales nosotros mismos.
Si le damos a localVarString un valor de nulo , veremos que los dos son, de hecho, ahora iguales:
String localVarString = null; assertEquals(fieldString, localVarString);
4. Inicialización de cadenas mediante literales
Creemos ahora dos String s usando el mismo literal:
String literalOne = "Baeldung"; String literalTwo = "Baeldung";
Confirmaremos que solo se crea un objeto comparando las referencias:
assertTrue(literalOne == literalTwo);
La razón de esto se remonta al hecho de que los String se almacenan en un grupo. literalOne agrega la cadena "baeldung" al grupo y literalTwo la reutiliza.
5. Inicialización de cadenas con nuevo
Sin embargo, veremos un comportamiento diferente si usamos la nueva palabra clave.
String newStringOne = new String("Baeldung"); String newStringTwo = new String("Baeldung");
Aunque el valor de ambos String s será el mismo que antes, esta vez tendremos a diferentes objetos:
assertFalse(newStringOne == newStringTwo);
6. Cadena vacía s
Creemos ahora tres String s vacíos :
String emptyLiteral = ""; String emptyNewString = new String(""); String emptyNewStringTwo = new String();
Como ya sabemos, el emptyLiteral se agregará al grupo de cadenas , mientras que los otros dos irán directamente al montón.
Aunque estos no serán los mismos objetos, todos tendrán el mismo valor:
assertFalse(emptyLiteral == emptyNewString) assertFalse(emptyLiteral == emptyNewStringTwo) assertFalse(emptyNewString == emptyNewStringTwo) assertEquals(emptyLiteral, emptyNewString); assertEquals(emptyNewString, emptyNewStringTwo);
7. Valores nulos
Finalmente, veamos cómo se comportan los String nulos .
Declaremos e inicializamos una cadena nula :
String nullValue = null;
Si imprimimos nullValue , veríamos la palabra "null", como vimos anteriormente. Y, si intentáramos invocar cualquier método en nullValue, obtendríamos una NullPointerException, como se esperaba.
Pero, ¿por qué se imprime "nulo"? ¿Qué es nulo en realidad?
Bueno, la especificación JVM dice que nulo es el valor predeterminado para todas las referencias, por lo que no está específicamente vinculado a la Cadena . Y de hecho, la especificación no exige ninguna codificación de valor concreto para nulo .
Entonces, ¿de dónde viene "nulo" para imprimir una cadena ?
Si echamos un vistazo a la implementación PrintStream # println , veremos que llama a String # valueOf :
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
Y, si miramos String # valueOf, obtenemos nuestra respuesta:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
Y, obviamente, esa es la razón de "nulo".
8. Conclusión
En este artículo, exploramos la inicialización de cadenas . Explicamos la diferencia entre declaración e inicialización. También tocamos el uso de new y la sintaxis literal.
Finalmente, echamos un vistazo a lo que significa asignar un valor nulo a una Cadena , cómo se representa el valor nulo en la memoria y cómo se ve cuando lo imprimimos.
Todos los ejemplos de código utilizados en el artículo están disponibles en Github.