Bien, así es como funcionan los tipos de datos en Java. (Tienes que disculpar mi inglés, soy un problema. No estoy usando el vocabulario correcto. Debes diferenciar entre dos. Los tipos de datos básicos y los tipos de datos normales. Los tipos de datos básicos constituyen prácticamente todo lo que existe. Por ejemplo, hay son todos números, caracteres, booleanos, etc. Los tipos de datos normales o los tipos de datos complejos son todo lo demás. Una cadena es una matriz de caracteres, por lo tanto, un tipo de datos complejo.
Cada variable que crea es en realidad un puntero sobre el valor en su memoria. Por ejemplo:
String s = new String("This is just a test");
la variable "s" NO contiene una cadena. Es un puntero. Este puntero apunta a la variable en su memoria. Cuando llamas System.out.println(anyObject)
, se llama al toString()
método de ese objeto. Si no se anula toString
desde Object, imprimirá el puntero. Por ejemplo:
public class Foo{
public static void main(String[] args) {
Foo f = new Foo();
System.out.println(f);
}
}
>>>>
>>>>
>>>>Foo@330bedb4
Todo detrás de la "@" es el puntero. Esto solo funciona para tipos de datos complejos. Los tipos de datos primitivos se guardan DIRECTAMENTE en su puntero. Entonces, en realidad no hay un puntero y los valores se almacenan directamente.
Por ejemplo:
int i = 123;
NO almaceno un puntero en este caso. Guardaré el valor entero 123 (en byte ofc).
Bien, entonces volvamos al ==
operador. Siempre compara el puntero y no el contenido guardado en la posición del puntero en la memoria.
Ejemplo:
String s1 = new String("Hallo");
String s2 = new String("Hallo");
System.out.println(s1 == s2);
>>>>> false
Estas dos cadenas tienen un puntero diferente. Sin embargo, String.equals (String other) compara el contenido. Puede comparar tipos de datos primitivos con el operador '==' porque el puntero de dos objetos diferentes con el mismo contenido es igual.
Nulo significaría que el puntero está vacío. Un tipo de datos primitivo vacío por defecto es 0 (para números). Sin embargo, nulo para cualquier objeto complejo significa que ese objeto no existe.
Saludos
null
no tiene ningún método, así que tampocoequals()
. SimyString
fuera asínull
, ¿cómo invocarías un método? :)