Diferencia entre una cadena Java nula y vacía ("")

151

¿Cuál es la diferencia entre nully el"" (cadena vacía)?

He escrito un código simple:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

Ambas declaraciones regresan false. Parece que no puedo encontrar cuál es la diferencia real entre ellos.

Vikas Patidar
fuente
66
Compare con b.equals(a), pero no lo use ==para comparar cadenas como "no funcionará" de otras maneras. El nullvalor (que es diferente de una cadena vacía "", una instancia de cadena válida) nunca puede tener un método invocado. Colocar el "no nulo conocido" (generalmente un valor constante o literal) al lado izquierdo de la igualdad es "Yoda condicionales" o algo así.

Respuestas:

220

"" es una cadena real, aunque vacía.

nulo, sin embargo, significa que la variable String no apunta a nada.

a==b devuelve falso porque "" y nulo no ocupan el mismo espacio en la memoria; en otras palabras, sus variables no apuntan a los mismos objetos.

a.equals(b) devuelve falso porque "" no es igual a nulo, obviamente.

Sin embargo, la diferencia es que, dado que "" es una cadena real, aún puede invocar métodos o funciones como

a.length()

a.substring(0, 1)

y así.

Si la cadena es igual a nula, como b, Java arrojaría a NullPointerExceptionsi intentara invocar, diga:

b.length()


Si la diferencia sobre la que se está preguntando es == versus igual, es esta:

== compara referencias, como si fuera

String a = new String("");
String b = new String("");
System.out.println(a==b);

Eso daría como resultado falso porque asigné dos objetos diferentes, y a y b apuntan a objetos diferentes.

Sin embargo, a.equals(b)en este caso devolvería verdadero, porque equalspara cadenas devolverá verdadero si y solo si el argumento Cadena no es nulo y representa la misma secuencia de caracteres.

Sin embargo, tenga en cuenta que Java tiene un caso especial para Strings.

String a = "abc";
String b = "abc";
System.out.println(a==b);

Se podría pensar que la salida sería false, ya que debería asignar dos cadenas diferentes. En realidad, Java internará cadenas literales (las que se inicializan como a y b en nuestro ejemplo). Así que tenga cuidado, porque eso puede dar algunos falsos positivos sobre cómo == funciona.

Zach L
fuente
¿Esto se aplica también a C #? Como en la matriz de "" es {'\ 0'}, un nulo
Cole Johnson
3
El enlace sobre internha expirado. Puede consultar otro sitio para leer sobre él: weblogs.java.net/blog/enicholas/archive/2006/06/…
Alston
Entonces, si tengo una Cadena nula String a = nully luego la agrego como Cadena a+= "example", cuando la imprimo, ¿por qué aparece nullexamplesi nulo no es una Cadena?
cpinamtz el
@PinaGamer JavaScript permite agregar sin cadenas a las cadenas. "num: " + 20te da la cuerda "num: 20". ¿Esto significa que 20es una cadena? (No 20es , es un número). El mismo caso para null: no es una cadena, pero se puede convertir en una si intenta agregarla.
daboross
@Zach L: cuando la cadena s = nulo + "a"; da salida nulla pero null.concat ("a") da la excepción de puntero nulo. ¿Cuál es la razón en mi primer caso nulo + "a"; está trabajando.
Ved Prakash
249

También puede comprender la diferencia entre una cadena nula y una vacía de esta manera:

Diferencia entre nulo y 0 / cadena vacía

Imagen original de R. Sato ( @raysato )

mikiqex
fuente
77
¡Esto es genial! Estaba explicando nulo vs vacío a alguien y encontré su respuesta. El concepto hizo clic inmediatamente para ellos.
matt.fc
14

La cadena es un objeto y puede ser nula

nulo significa que el objeto de cadena no fue instanciado

"" es un valor real de la Cadena de Objetos instanciada como "aaa"

Aquí hay un enlace que podría aclarar ese punto http://download.oracle.com/javase/tutorial/java/concepts/object.html

Aba Dov
fuente
"nulo significa que el objeto de cadena no fue instanciado" - ¡gracias! eso me ayuda a entender mucho las cosas. pude usar una declaración if en un objeto MediaPlayer una vez, y funcionó para usar nulo, para verificar si se estaba ejecutando o no (con un método para ejecutar si lo era), pero nunca entendí por qué funcionó, pero ahora veo lo que decía, estaba comprobando si MediaPlayer se había instanciado o no, usando null ... por ejemplo if (mp==null){do something}.
Azurespot
12

Lo que sus declaraciones le dicen es que "" no es lo mismo que nulo, lo cual es cierto. "" es una cadena vacía; nulo significa que no se ha asignado ningún valor.

Puede ser más esclarecedor intentarlo:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

"" sigue siendo una cadena, lo que significa que puede llamar a sus métodos y obtener información significativa. nulo es una variable vacía, literalmente no hay nada allí.

Arkaaito
fuente
9

Hay una diferencia bastante significativa entre los dos. La cadena vacía ""es "la cadena que no tiene caracteres". Es una cadena real que tiene una longitud bien definida. Todas las operaciones de cadena estándar están bien definidas en la cadena vacía: puede convertirla a minúsculas, buscar el índice de algún carácter, etc. La cadena nula null"no es ninguna cadena". No tiene una longitud porque no es una cadena en absoluto. Intentar aplicar cualquier operación de cadena estándar a la cadena nula provocará un NullPointerExceptiontiempo de ejecución.

templatetypedef
fuente
9

aquí a is an Objectpero nob(null) es un objeto, es una referencia nula

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

Aquí está mi respuesta similar

Comunidad
fuente
1
Ambos ay bson referencias. aes una referencia con un objeto instanciado. bes una referencia sin un objeto instanciado (de ahí el término "referencia nula").
SOLO MI OPINIÓN correcta
Contrarresté el -1 ;-) Pero ayudaría a aclarar esta respuesta y discutir la diferencia entre "un objeto" y el nullvalor y la diferencia entre objetos y variables.
@pst gracias :) Lo respondí de memoria porque aquí está mi otra respuesta similar a esta pregunta stackoverflow.com/questions/4459623/…
8

nulo significa que el nombre no hace referencia a ningún objeto instanciado. "" significa una cadena vacía.

Aquí a está haciendo referencia a algún objeto que resulta ser una cadena vacía. b no hace referencia a ningún objeto ya que es nulo.

Shamim Hafiz
fuente
5

En Java, un tipo de referencia asignado nonull tiene ningún valor . Una cadena asignada ""tiene un valor: una cadena vacía, es decir, una cadena sin caracteres. Cuando se asigna una variable null, significa que no hay ningún objeto subyacente de ningún tipo, cadena o de otro tipo.

SOLO MI OPINIÓN correcta
fuente
4

"" y nulo ambos son diferentes. el primero significa que, como parte de la declaración de variable de cadena, la constante de cadena se ha creado en el conjunto de cadenas y se ha asignado algo de memoria para la misma.

Pero cuando lo declaramos con nulo , se acaba de crear una instancia de jvm, pero no se le ha asignado memoria. por lo tanto, si está intentando acceder a este objeto verificándolo con "" - variable en blanco, no puede evitar la excepción nulopointerexception. A continuación encontrará un caso de uso.

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}

siddhartha
fuente
4
String s = "";
s.length();

String s = null;
s.length();

Una referencia a una cadena vacía "" apunta a un objeto en el montón, por lo que puede llamar a métodos en él.

Pero una referencia que apunta a nullno tiene ningún objeto para apuntar en el montón y, por lo tanto, obtendrá un NullPointerException.

Mukesh Kumar
fuente
1

La cadena vacía es distinta de una referencia nula en que, en un lenguaje de programación orientado a objetos, una referencia nula a un tipo de cadena no apunta a un objeto de cadena y causará un error si uno intenta realizar cualquier operación en él. La cadena vacía sigue siendo una cadena sobre la cual se pueden intentar operaciones de cadena.

Del artículo de Wikipedia en cadena vacía .

weltraumpirat
fuente
1

String s=null;

La cadena no se inicializa para nulo. si alguna operación de cadena lo intentó, puede arrojar una excepción de puntero nulo

String t="null";

Es una cadena literal con cadena de valor "nulo" igual que t = "xyz". No arrojará un puntero nulo.

String u="";

Es como una cadena vacía, no arrojará un puntero nulo.

Bharat Kasodariya
fuente
0

Una cadena puede estar vacía o tener un nullvalor. Si una cadena es null, no se refiere a nada en la memoria. Tratar s.length()>0. Esto se debe a que si una cadena está vacía, aún devuelve una longitud de 0. Por lo tanto, si no ingresa nada para lo mismo, continuará en bucle ya que no registra la cadena como null. Mientras que si verifica la longitud, saldrá de su bucle.

Bibiana
fuente
0

Este concepto se puede entender mejor desde las matemáticas. ¿Alguna vez ha intentado dividir un número (no cero) por 0 usando una calculadora, por ejemplo, 7/0? Obtendrá un resultado que se ve como algo presente: undefined, not a number,null etc. Esto significa que la operación no es posible, por algunas razones (vamos a dejar esas razones que se discutirán otro día).

Ahora, realiza esto: 0/7. Obtendrá la salida, 0. Esto significa que la operación es posible y puede ejecutarse, pero la respuesta es solo 0 porque no queda nada después de la división. Hay una salida válida y esa salida es cero.

En el primer ejemplo, la salida no solo era inválida, sino que la operación no se podía ejecutar. Esto es similar a una nullcadena en Java. El segundo ejemplo es similar a una emptycadena.


fuente
0

Cuando escribes

String a = "";

Significa que hay una variable 'a' de tipo cadena que apunta a una referencia de objeto en el grupo de cadenas que tiene un valor "". Como la variable acontiene una referencia de objeto de cadena válida, todos los métodos de cadena se pueden aplicar aquí.

Mientras que cuando escribes

String b = null;

Significa que hay una variable bde tipo cadena que apunta a una referencia desconocida . Y cualquier operación en referencia desconocida dará como resultado un NullPointerException.

Ahora, evaluemos las siguientes expresiones.

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed
Neeraj Singh
fuente
0

En términos simples,

  • "" es una cadena vacía

  • null es una variable de cadena vacía .

RoboAlex
fuente
0

Diferencia entre cadena nula y vacía. Por ejemplo: tiene una variable llamada x. Si escribes en JS,

var x = "";

Esto significa que ha asignado un valor que es una cadena vacía (la longitud es 0). En realidad, esto es como algo, pero no se siente nada :) Por otro lado,

var y = null;

Esto significa que no le ha asignado un valor a y que dice claramente escribiendo nulo a y en el momento de la declaración. Si escribes y.length; arrojará un error que indica que ningún valor asignado a y, como resultado, no puede leer la longitud de y.

RashedRahat
fuente
La pregunta es para Java
Vega
0

ingrese la descripción de la imagen aquí

Esta imagen puede ayudarlo a comprender las diferencias.

La imagen fue recolectada de ProgrammerHumor

Sazzad Hissain Khan
fuente
0

"Lo llamo mi error de mil millones de dólares. Fue la invención de la referencia nula en 1965" - https://en.wikipedia.org/wiki/Tony_Hoare

Con respecto al mundo real, ambos pueden suponerse lo mismo. Es solo una sintaxis de un lenguaje de programación que crea una diferencia entre dos como lo explican otros aquí. Esto simplemente crea una sobrecarga como cuando se verifica / compara si la variable de cadena tiene algo, primero debe verificar si no es nulo y luego comparar la cadena real, es decir, dos comparaciones. Esto es un desperdicio de poder de procesamiento para cada comparación de cadenas.

Objects.equals () busca nulos antes de llamar a .equals ().

Shivakumar
fuente
0

como curiosidad

    String s1 = null;
    String s2 = "hello";

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
Duracell De Monaco
fuente