[Transferir] No se confunda más acerca de la diferencia entre == e iguales en java, este artículo garantiza que puede entender

Pensando que debería haber visto esta pregunta innumerables veces, o puede haber leído innumerables artículos. Si todavía está confundido o no entiende, intente leer este artículo, creo que podrá entenderlo.

1. Comprender el significado de "=="

En Java, hay dos funciones principales.

1. Tipo de datos básicos: la comparación es si sus valores son iguales, como dos variables de tipo int, la comparación es si los valores de las variables son iguales.

2. Tipo de datos de referencia: la comparación es si las direcciones referenciadas son las mismas. Por ejemplo, si se crean dos objetos Usuario, la comparación es si las direcciones de los dos Usuarios son las mismas.

DE ACUERDO. Preste atención aquí, encontrará que cuando cité el ejemplo, usé el objeto Usuario en lugar de Cadena. No te preocupes y sigue leyendo.

Segundo, entender el significado de iguales

Primero mire su código fuente, el método equals existe en Object. Tenga en cuenta que el código fuente aquí es igual a Object.

A partir de este código fuente, encontrará que la comparación es si la referencia del objeto actual es la misma que la referencia de obj, es decir, el valor predeterminado de la comparación es la dirección. ¿Recuerdas que usamos User en lugar de String? Aquí == compara las direcciones a las que se hace referencia, y equals también compara las direcciones a las que se hace referencia, por lo que sus efectos son los mismos aquí.

Ahora encontrará que la función de equals parece ser la misma que la de ==, entonces, ¿qué son esas cosas desordenadas del tipo String? Siga leyendo para averiguarlo pronto.

3. Reescribir es igual

1. El método de igualdad en String

Al ver este título, creo que ya puede encontrar la respuesta. No hay diferencia entre == y equals en el objeto Object. De esta manera, la existencia del método equals realmente no tiene sentido, pero luego String reescribe equals sobre la base de Object. , por lo que la función cambia mucho. ¿Cómo reescribirlo? Busquemos la respuesta en el código fuente de String:

Del código fuente anterior, la información que podemos obtener es: el método equals en String en realidad compara si el contenido de las cadenas es el mismo. Es decir, si anula clases iguales como String y Date, debe tener cuidado. Cuando se use, será diferente de Object.

2. Cadena de prueba

Echa un vistazo al código a continuación:

En el código anterior, se definen tres cadenas, que se comparan usando == y equals respectivamente. ¿Por qué hay tal resultado? También necesita ser explicado desde la perspectiva de la memoria.

3. Explicación de la memoria

En Java, generalmente almacenamos objetos en el área del montón y colocamos referencias de objetos en el área de la pila. Por lo tanto, el estado de la memoria de las tres cadenas anteriores debe ser el siguiente.

Entiendo ahora.

(1) String str1 = "Hola" almacenará un objeto de cadena en el montón

(2) String str2 = new String ("Hola") almacenará un objeto de cadena nuevamente en el montón

(3)String str3 = str2 En este momento, Str3 y Str2 son dos referencias diferentes, pero apuntan al mismo objeto.

Eche un vistazo a la comparación anterior basada en esta imagen:

(1) str1 == str2? ¿Eso significa que la dirección apunta al mismo lugar? Obviamente diferente.

(2) str1 == str3? ¿Eso significa que la dirección apunta al mismo lugar? Obviamente diferente.

(3) str2 == str3? ¿Eso significa que la dirección apunta al mismo lugar? Obviamente el contenido es el mismo, por lo que es cierto.

(4) str1 es igual a (str2)? ¿Eso significa que la dirección apunta al mismo contenido? Mismo.

(4) str1 es igual a (str3)? ¿Eso significa que la dirección apunta al mismo contenido? Mismo.

(4) str2 es igual a (str3)? ¿Eso significa que la dirección apunta al mismo contenido? Mismo.

DE ACUERDO. No sé si puedes entender ahora.

4. Resumen:

(1), comparación de tipos básicos

Use == para comparar valores de igualdad.

(2), comparación de tipo de referencia

① Anule el método de igualdad, como String.

El primer caso: use == para comparar si la referencia de String apunta a la misma memoria

El segundo caso: use equals para comparar si los objetos a los que hace referencia String son iguales.

②El método equals no se reescribe, como las clases definidas por el usuario, como User

== y equals comparan si la referencia apunta al mismo bloque de memoria.

5. Un pequeño problema

Por supuesto, el tipo String aún no ha terminado y hay un pequeño problema que requiere la atención de todos. Por ejemplo, mira el siguiente código:

在这里多了一个intern方法。他的意思是检查字符串池里是否存在,如果存在了那就直接返回为true。因此在这里首先s1会在字符串池里面有一个,然后 s2.intern()一看池子里有了,就不再新建了,直接把s2指向它。

转载:https://baijiahao.baidu.com/s?id=1652442464525126879&wfr=spider&for=pc

Supongo que te gusta

Origin blog.csdn.net/m0_53121042/article/details/114847146
Recomendado
Clasificación