He estado usando el ==
operador en mi programa para comparar todas mis cadenas hasta ahora. Sin embargo, me encontré con un error, cambié uno de ellos .equals()
y solucionó el error.
Es ==
malo? ¿Cuándo debería y no debería usarse? ¿Cual es la diferencia?
==
funciona de la misma manera en Objetos: stackoverflow.com/a/19966154/2284641==
funcionará algunas veces, ya que Java tiene un conjunto de cadenas, donde intenta reutilizar las referencias de memoria de las cadenas de uso común. Pero==
compara que los objetos son iguales, no los valores ... también lo.equals()
es el uso adecuado que desea usar."12"=="1"+2
es falso (probablemente)Respuestas:
==
prueba la igualdad de referencia (si son el mismo objeto)..equals()
prueba la igualdad de valores (si son lógicamente "iguales").Objects.equals () verifica
null
antes de llamar.equals()
para que no tenga que hacerlo (disponible a partir de JDK7, también disponible en Guava ).En consecuencia, si desea probar si dos cadenas tienen el mismo valor, probablemente querrá usarlas
Objects.equals()
.Casi siempre quieres usar
Objects.equals()
. En la rara situación en la que sabe que está tratando con internadas cuerdas, se puede utilizar==
.De JLS 3.10.5. Literales de cuerda :
También se pueden encontrar ejemplos similares en JLS 3.10.5-1 .
Otros métodos a considerar
String.equalsIgnoreCase () valor de igualdad que ignora mayúsculas y minúsculas.
String.contentEquals () compara el contenido de
String
con el contenido de anyCharSequence
(disponible desde Java 1.5). Le ahorra tener que convertir su StringBuffer, etc. en una cadena antes de hacer la comparación de igualdad, pero deja la comprobación nula para usted.fuente
==
comprueba el valor de una variable. Cuando tiene un objeto, la variable que hace referencia al objeto tiene la referencia del objeto como valor . Por lo tanto, compara las referencias al comparar dos variables con==
. Al comparar un tipo de datos primitivo comoint
, sigue siendo el mismo caso. Una variable de tipoint
tiene el entero como valor. Por lo tanto, compara los valores de dosint
s usando==
. Si elint
es el valor de una variable o un número mágico, no importa. Además: una referencia no es más que un número que se refiere a la memoria.==
prueba referencias de objeto,.equals()
prueba los valores de cadena.A veces parece que
==
compara valores, porque Java hace algunas cosas detrás de escena para asegurarse de que cadenas idénticas en línea sean realmente el mismo objeto.Por ejemplo:
¡Pero cuidado con los nulos!
==
maneja lasnull
cadenas bien, pero llamar.equals()
desde una cadena nula provocará una excepción:Entonces, si sabe que
fooString1
puede ser nulo, dígale al lector que escribiendoLos siguientes son más cortos, pero es menos obvio que verifica nulo:
fuente
==
hacer valores siempre comparar! (¡Es solo que ciertos valores son referencias!)?.
. Eso se convertiríanullString1?.equals(nullString2);
en una declaración completamente nula. Sin embargo, no ayuda si lo ha hechovalidString?.equals(nullString);
, eso todavía arroja una excepción.==
compara referencias de objetos..equals()
compara los valores de cadena.A veces
==
da ilusiones de comparar valores de cadena, como en los siguientes casos:Esto se debe a que cuando crea cualquier literal de cadena, la JVM primero busca ese literal en el grupo de cadenas y, si encuentra una coincidencia, se le dará la misma referencia a la nueva cadena. Debido a esto, obtenemos:
(a == b) ===> verdadero
Sin embargo,
==
falla en el siguiente caso:En este caso para
new String("test")
la declaración, se creará una nueva Cadena en el montón, y se le dará esa referenciab
, por lo queb
se le dará una referencia en el montón, no en el conjunto de Cadenas.Ahora
a
apunta a una cadena en el grupo de cadenas mientrasb
señala a una cadena en el montón. Por eso obtenemos:if (a == b) ===> falso.
Mientras
.equals()
siempre compara un valor de String, por lo tanto, es cierto en ambos casos:Entonces usar
.equals()
siempre es mejor.fuente
.equals()
método compara las instancias (referencias / dirección) donde como clase String.equals()
métodos se reemplaza para comparar contenido (caracteres)String
objetos para guardar la huella de la memoria, ya queString
se sabe que es inmutable (espero, lo digo correctamente aquí). También consulte stackoverflow.com/questions/3052442/…El
==
operador verifica si las dos cadenas son exactamente el mismo objeto.El
.equals()
método verificará si las dos cadenas tienen el mismo valor.fuente
Las cadenas en Java son inmutables. Eso significa que cada vez que intente cambiar / modificar la cadena obtendrá una nueva instancia. No puede cambiar la cadena original. Esto se ha hecho para que estas instancias de cadena se puedan almacenar en caché. Un programa típico contiene muchas referencias de cadenas y el almacenamiento en caché de estas instancias puede disminuir la huella de memoria y aumentar el rendimiento del programa.
Cuando se utiliza el operador == para la comparación de cadenas, no está comparando el contenido de la cadena, sino que en realidad está comparando la dirección de la memoria. Si ambos son iguales, devolverá verdadero y falso de lo contrario. Mientras que igual en cadena compara el contenido de la cadena.
Entonces, la pregunta es si todas las cadenas están en caché en el sistema, ¿cómo es que
==
devuelve falso mientras que igual devuelve verdadero? Bueno, esto es posible. SiString str = new String("Testing")
crea una nueva cadena como si terminara creando una nueva cadena en el caché, incluso si el caché ya contiene una cadena que tiene el mismo contenido. En breve"MyString" == new String("MyString")
siempre devolverá falso.Java también habla sobre la función interna () que se puede usar en una cadena para hacerla parte de la memoria caché.
"MyString" == new String("MyString").intern()
lo que devolverá verdadero.Nota: == el operador es mucho más rápido que igual solo porque está comparando dos direcciones de memoria, pero debe asegurarse de que el código no esté creando nuevas instancias de String en el código. De lo contrario, encontrará errores.
fuente
Asegúrate de entender por qué. Es porque la
==
comparación solo compara referencias; laequals()
método realiza una comparación carácter por carácter de los contenidos.Cuando llama a nuevo para
a
yb
, cada uno obtiene una nueva referencia que apunta a la"foo"
tabla de cadenas. Las referencias son diferentes, pero el contenido es el mismo.fuente
Sí, es malo ...
==
significa que sus dos referencias de cadena son exactamente el mismo objeto. Es posible que haya escuchado que este es el caso porque Java mantiene una especie de tabla literal (lo que hace), pero ese no es siempre el caso. Algunas cadenas se cargan de diferentes maneras, construidas a partir de otras cadenas, etc., por lo que nunca debe suponer que dos cadenas idénticas se almacenan en la misma ubicación.Igual hace la comparación real para usted.
fuente
Sí,
==
es malo para comparar cadenas (cualquier objeto realmente, a menos que sepa que son canónicos).==
solo compara referencias de objetos..equals()
pruebas de igualdad. Para las cadenas, a menudo serán las mismas, pero como has descubierto, eso no siempre está garantizado.fuente
Java tiene un conjunto de cadenas bajo el cual Java gestiona la asignación de memoria para los objetos de cadena. Ver grupos de cadenas en Java
Cuando marca (compara) dos objetos con el
==
operador, compara la igualdad de direcciones en el conjunto de cadenas. Si los dos objetos String tienen las mismas referencias de dirección, se devuelvetrue
, de lo contrariofalse
. Pero si desea comparar el contenido de dos objetos String, debe anular elequals
método.equals
es en realidad el método de la clase Object, pero se reemplaza en la clase String y se proporciona una nueva definición que compara el contenido del objeto.Pero tenga en cuenta que respeta el caso de String. Si desea comparar entre mayúsculas y minúsculas, debe utilizar el método equalsIgnoreCase de la clase String.
Veamos:
fuente
equalsIgnoreCase
que podría ser informativo para los más frescos.Estoy de acuerdo con la respuesta de zacherates.
Pero lo que puede hacer es invocar
intern()
sus cadenas no literales.Del ejemplo de zacherates:
Si internas, la igualdad de cadena no literal es
true
:fuente
==
para la comparación de cadenas.==
compara referencias de objetos en Java , y eso no es una excepción para losString
objetos.Para comparar el contenido real de los objetos (incluido
String
), uno debe usar elequals
método .Si resulta ser una comparación de dos
String
objetos usando , es porque los objetos fueron internados y la Máquina virtual Java tiene múltiples referencias que apuntan a la misma instancia de . No se debe esperar comparar un objeto que contiene el mismo contenido que otro objeto para evaluar como .==
true
String
String
String
String
==
true
fuente
.equals()
compara los datos en una clase (suponiendo que la función esté implementada).==
compara las ubicaciones del puntero (ubicación del objeto en la memoria).==
devuelve verdadero si ambos objetos (NO HABLAR DE PRIMITIVAS) apuntan a la MISMA instancia de objeto..equals()
devuelve verdadero si los dos objetos contienen los mismos datosequals()
Versus==
en JavaEso puede ayudarte.
fuente
==
realiza una comprobación de igualdad de referencia , si los 2 objetos (cadenas en este caso) se refieren al mismo objeto en la memoria.El
equals()
método verificará si el contenido o los estados de 2 objetos son iguales.Obviamente
==
es más rápido, pero (podría) dar resultados falsos en muchos casos si solo desea saber si 2String
s contienen el mismo texto.Definitivamente
equals()
se recomienda el uso del método.No te preocupes por el rendimiento. Algunas cosas para alentar el uso
String.equals()
:String.equals()
primeras verificaciones para la igualdad de referencia (usando==
), y si las 2 cadenas son las mismas por referencia, ¡no se realiza ningún cálculo adicional!String.equals()
luego verificaremos las longitudes de las cadenas. Esta también es una operación rápida porque laString
clase almacena la longitud de la cadena, no es necesario contar los caracteres o los puntos de código. Si las longitudes difieren, no se realiza ninguna otra verificación, sabemos que no pueden ser iguales.Cuando todo está dicho y hecho, incluso si tenemos la garantía de que las cadenas son pasantes, el uso del
equals()
método todavía no es esa sobrecarga que uno podría pensar, definitivamente la forma recomendada. Si desea una verificación de referencia eficiente, utilice enumeraciones donde la especificación y la implementación del lenguaje garanticen que el mismo valor de enumeración será el mismo objeto (por referencia).fuente
Obviously == is faster
- En realidad, la implementación de las.equals(String)
primeras verificaciones==
antes que cualquier otra cosa, por lo que diría que la velocidad es casi idéntica.public boolean equals(Object anObject) { if (this == anObject) { return true; } ...
Si eres como yo, cuando comencé a usar Java, quería usar el operador "==" para probar si dos instancias de String eran iguales, pero para bien o para mal, esa no es la forma correcta de hacerlo en Java.
En este tutorial demostraré varias formas diferentes de comparar correctamente las cadenas de Java, comenzando con el enfoque que uso la mayor parte del tiempo. Al final de este tutorial de comparación de cadenas de Java, también analizaré por qué el operador "==" no funciona al comparar cadenas de Java.
Opción 1: comparación de cadenas de Java con el método de igualdad La mayoría de las veces (tal vez el 95% del tiempo) comparo cadenas con el método de igualdad de la clase de cadena de Java, así:
Este método de cadenas iguales examina las dos cadenas de Java, y si contienen exactamente la misma cadena de caracteres, se consideran iguales.
Echando un vistazo a un ejemplo rápido de comparación de cadenas con el método de igualdad, si se ejecutara la siguiente prueba, las dos cadenas no se considerarían iguales porque los caracteres no son exactamente iguales (el caso de los caracteres es diferente):
Pero, cuando las dos cadenas contienen exactamente la misma cadena de caracteres, el método igual devolverá verdadero, como en este ejemplo:
Opción 2: comparación de cadenas con el método equalsIgnoreCase
En algunas pruebas de comparación de cadenas, querrá ignorar si las cadenas son mayúsculas o minúsculas. Cuando desee probar la igualdad de sus cadenas de esta manera que no distinga entre mayúsculas y minúsculas, use el método equalsIgnoreCase de la clase String, así:
Opción 3: comparación de cadenas de Java con el método compareTo
También hay una tercera forma, menos común, de comparar cadenas Java, y es con el método compareTo de la clase String. Si las dos cadenas son exactamente iguales, el método compareTo devolverá un valor de 0 (cero). Aquí hay un ejemplo rápido de cómo se ve este enfoque de comparación de cadenas:
Mientras escribo sobre este concepto de igualdad en Java, es importante tener en cuenta que el lenguaje Java incluye un método igual en la clase base de objetos Java. Siempre que esté creando sus propios objetos y desee proporcionar un medio para ver si dos instancias de su objeto son "iguales", debe anular (e implementar) este método igual en su clase (de la misma manera que el lenguaje Java proporciona este comportamiento de igualdad / comparación en el método String es igual).
Es posible que desee echar un vistazo a this ==, .equals (), compareTo () y compare ()
fuente
Función:
Prueba:
fuente
==
yequals
ya fue respondida por otras soluciones, simplemente ofrecí una forma diferente de comparar las cadenas de una manera sueltaEl
==
operador verifica si las dos referencias apuntan al mismo objeto o no..equals()
verifique el contenido real de la cadena (valor).Tenga en cuenta que el
.equals()
método pertenece a la claseObject
(superclase de todas las clases). Debe anularlo según los requisitos de su clase, pero para String ya está implementado y verifica si dos cadenas tienen el mismo valor o no.Caso 1
Motivo: los literales de cadena creados sin nulo se almacenan en el grupo de cadenas en el área permgen del montón. Entonces, tanto s1 como s2 apuntan al mismo objeto en el grupo.
Caso 2
Motivo: si crea un objeto String con la
new
palabra clave, se le asigna un espacio separado en el montón.fuente
==
compara el valor de referencia de los objetos, mientras que elequals()
método presente en lajava.lang.String
clase compara el contenido delString
objeto (con otro objeto).fuente
equals()
método paraString
está realmente en laString
clase, no enObject
. El valor predeterminadoequals()
enObject
no compararía que el contenido sea el mismo, y de hecho solo devuelve verdadero cuando la referencia es la misma.Creo que cuando define un
String
define un objeto. Entonces necesitas usar.equals()
. Cuando usa tipos de datos primitivos que usa==
pero conString
(y cualquier objeto) debe usar.equals()
.fuente
Si el
equals()
método está presente en lajava.lang.Object
clase, ¡y se espera que verifique la equivalencia del estado de los objetos! Eso significa, el contenido de los objetos. Mientras==
que se espera que el operador verifique que las instancias de objeto reales sean iguales o no.Ejemplo
Considere dos variables de referencia diferentes,
str1
ystr2
:Si usas el
equals()
Obtendrá la salida como
TRUE
si la usara==
.Ahora obtendrá la
FALSE
salida como, porque ambosstr1
ystr2
apuntan a dos objetos diferentes a pesar de que ambos comparten el mismo contenido de cadena. Es debidonew String()
a que se crea un nuevo objeto cada vez.fuente
Operador == siempre está destinado a la comparación de referencias de objetos , mientras que el método de clase de cadena .equals () se anula para la comparación de contenido :
fuente
Se garantiza que todos los objetos tienen un
.equals()
método ya que Object contiene un método.equals()
, que devuelve un valor booleano. El trabajo de la subclase es anular este método si se requiere una definición adicional. Sin él (es decir, usando==
) solo se verifican las direcciones de memoria entre dos objetos para garantizar la igualdad. La cadena anula esto.equals()
método y, en lugar de utilizar la dirección de memoria, devuelve la comparación de cadenas en el nivel de caracteres para la igualdad.Una nota clave es que las cadenas se almacenan en un conjunto de bloques, por lo que una vez que se crea una cadena, se almacena para siempre en un programa en la misma dirección. Las cadenas no cambian, son inmutables. Es por eso que es una mala idea usar la concatenación de cadenas regular si tiene una gran cantidad de procesamiento de cadenas que hacer. En su lugar, usaría las
StringBuilder
clases proporcionadas. Recuerde que los punteros a esta cadena pueden cambiar y si estuviera interesado en ver si dos punteros eran iguales==
, sería un buen camino a seguir. Las cuerdas no lo hacen.fuente
final String
variables) y las cadenas que su programa internamente explícitamente se almacenan en lo que usted llama un "conjunto de bloques". Todos los demásString
objetos están sujetos a recolección de basura una vez que no hay más referencias en vivo a ellos, al igual que cualquier otro tipo de objeto. Además, si bien se requiere la inmutabilidad para que funcione todo el mecanismo de internamiento, de lo contrario es irrelevante para esto.También puedes usar el
compareTo()
método para comparar dos cadenas. Si el resultado compareTo es 0, entonces las dos cadenas son iguales, de lo contrario las cadenas que se comparan no son iguales.El
==
compara las referencias y no compara las cadenas reales. Si creó cada cadena usando,new String(somestring).intern()
entonces puede usar el==
operador para comparar dos cadenas, de lo contrario solo se pueden usar los métodos igual () o compareTo.fuente
En Java, cuando el operador "==" se usa para comparar 2 objetos, verifica si los objetos se refieren al mismo lugar en la memoria. En otras palabras, verifica si los 2 nombres de objeto son básicamente referencias a la misma ubicación de memoria.
La clase Java String en realidad anula la implementación equals () predeterminada en la clase Object, y anula el método para que verifique solo los valores de las cadenas, no sus ubicaciones en la memoria. Esto significa que si llama al método equals () para comparar 2 objetos String, entonces, siempre que la secuencia real de caracteres sea igual, ambos objetos se considerarán iguales.
fuente