Los tipos de datos en Java se pueden dividir en dos categorías:
1. Tipos de datos básicos, también llamados tipos de datos primitivos. Para comparar byte, short, char, int, long, float, double, boolean, use el doble signo igual (==) y compare sus valores.
2. Tipos de datos compuestos (clases) Cuando se comparan usando (==), se comparan con sus direcciones de almacenamiento en la memoria. Por lo tanto, a menos que sean el mismo objeto nuevo, el resultado de su comparación es verdadero; de lo contrario, la comparación. el resultado es falso. Todas las clases en JAVA heredan de la clase base Objeto. La clase base en Objeto define un método igual. El comportamiento inicial de este método es comparar las direcciones de memoria de los objetos. Sin embargo, en algunas bibliotecas de clases este método está anulado, como String. , Integer y Date, es igual a tener su propia implementación en estas clases, en lugar de comparar la dirección de almacenamiento de la clase en la memoria del montón. Para una comparación igual entre tipos de datos compuestos, sin anular el método igual, la comparación entre ellos todavía se basa en el valor de la dirección de su ubicación de almacenamiento en la memoria, porque el método igual de Objeto también usa un doble signo igual (==). , por lo que el resultado de la comparación es el mismo que el resultado del doble signo igual (==).
Copie el código de código de la siguiente manera:
cadena de prueba de clase pública {
publicstaticvoid principal (cadena [] argumentos) {
Cadena s1="lunes";
Cadena s2="lunes";
si (s1 == s2)
{
System.out.println("s1 == s2");}
demás{
System.out.println("s1!= s2");}
}
}
Compile y ejecute el programa, salida: s1 == s2 Nota: s1 y s2 se refieren al mismo objeto String - "Monday" 2. Si cambia ligeramente el programa, encontrará algo aún más extraño:
Copie el código de código de la siguiente manera:
cadena de prueba de clase pública {
publicstaticvoid principal (String [] args)
{
Cadena s1="lunes";
Cadena s2 = nueva cadena ("lunes");
if (s1 == s2) {System.out.println("s1 == s2");
}
demás
{
System.out.println("s1!= s2");
}
si (s1.es igual a (s2))
{
System.out.println("s1 es igual a s2");
}
demás
{
System.out.println("s1 no es igual a s2");
}
}
}
Usamos el nuevo operador para crear la salida del programa para s2: s1 != s2 s1 es igual a s2 Nota: s1 y s2 se refieren a dos objetos String "lunes" respectivamente.
3. Grupo de búfer de cadenas Resulta que el programa creará un grupo de búfer de cadenas cuando se esté ejecutando. Cuando se utiliza una expresión como s2 = "lunes" para crear una cadena, el programa primero buscará el mismo valor en la cadena. grupo de búfer. Objeto, en el primer programa, s1 se colocó por primera vez en el grupo, por lo que cuando se creó s2, el programa encontró s1 con el mismo valor y hizo referencia a s2 al objeto "lunes" al que hace referencia s1. usado nuevo operador, le dice claramente al programa: "¡Quiero uno nuevo! ¡No el antiguo!". Entonces se crea un nuevo objeto Sting "lunes" en la memoria. Sus valores son los mismos, pero sus ubicaciones son diferentes, uno está nadando en la piscina y el otro descansando en la orilla. Vaya, qué desperdicio de recursos. ¿Por qué tenemos que separarlos cuando obviamente son iguales?
4. Cambie el programa nuevamente:
Copie el código de código de la siguiente manera:
cadena de prueba de clase pública
{
publicstaticvoid principal (String [] args)
{
Cadena s1="lunes";
Cadena s2 = nueva cadena ("lunes");
s2 = s2.interno();
si (s1 == s2)
{
System.out.println("s1 == s2");
}
demás
{
System.out.println("s1!= s2");
}
si (s1.es igual a (s2))
{
System.out.println("s1 es igual a s2");
}
demás
{
System.out.println("s1 no es igual a s2");
}
}
}
Esta vez se agregó: s2 = s2.intern(); Salida del programa: s1 == s2 s1 es igual a s2. Resulta que el método intern() "abc" de (java.lang.String). El valor de retorno del método intern() sigue siendo la cadena "abc". En la superficie, parece que este método no sirve de nada. Pero de hecho, hace un pequeño truco: verifique si hay una cadena "abc" en el grupo de cadenas. Si existe, devuelva la cadena en el grupo; si no existe, este método agregará "abc" a la cadena; pool y luego devolverlo.)