¿Cuál es la diferencia entre el String#equals
método y el String#contentEquals
método?
152
¿Cuál es la diferencia entre el String#equals
método y el String#contentEquals
método?
El String#equals()
no solo compara el contenido de la Cadena, sino que también comprueba si el otro objeto también es una instancia de a String
. El String#contentEquals()
único compara el contenido (la secuencia de caracteres) y no comprueba si el otro objeto también es una instancia de String
. Puede ser cualquier cosa, siempre y cuando se trata de una aplicación de CharSequence
la que cubre ao String
, StringBuilder
, StringBuffer
, CharBuffer
, etc.
==
(contentEquals) y===
(equals) en javascript?==
operador solo le permitirá comparar las referencias, no el contenido de dos objetos.==
mencionado es solo JavaScript; nunca se menciona con respecto a Java.==
en JavaScript es mucho más flexible quecontentEquals
, lo que no tocará números, por ejemplo), pero está en lo correcto alequals
verificar una coincidencia de tipo exacta conStrings
(otras clases podrían ser más flexibles con los tipos en susequals
métodos) .Para decirlo fácilmente:
String.contentEquals()
es el hermano más inteligente deString.equals()
, porque puede ser más libre en la implementación queString.equals()
.Hay algunas razones por las cuales hay un
String.contentEquals()
método separado . La razón más importante que creo es:equals
método tiene que ser reflexivo. Eso significa que:x.equals(y) == y.equals(x)
. Esto implica queaString.equals(aStringBuffer)
tendría que ser lo mismo queaStringBuffer.equals(aString)
. Esto requeriría que los desarrolladores de la API Java realicen una implementación especial para Strings en elequals()
método de StringBuffer, StringBuilder y CharSequence también. Esto sería un desastre.Aquí es donde
String.contentEquals
entra. Se trata de un método independiente que no no tiene por qué seguir los estrictos requisitos y normas paraObject.equals
. De esta manera, puede implementar el sentido de "contenido igual" más libremente. Esto le permite hacer comparaciones inteligentes entre un StringBuffer y un String, por ejemplo.Y para decir cuál es exactamente la diferencia:
String.contentEquals()
puede comparar los contenidos de aString
, aStringBuilder
, aStringBuffer
, aCharSequence
y todas las clases derivadas de estos. Si el parámetro es de tipo String,String.equals()
se ejecuta.String.equals()
solo compara objetos String. Todos los demás tipos de objetos se consideran no iguales.String.contentEquals()
puede compararStringBuffer
yStringBuilder
de manera inteligente. No , no llame a la pesadatoString()
método, que copia todo el contenido de un nuevo objeto String. En cambio, se compara con lachar[]
matriz subyacente , que es genial.fuente
Esta respuesta ya fue publicada por dbw, pero la eliminó, pero tenía algunos puntos muy válidos para la diferencia al comparar el tiempo de ejecución, qué excepciones se lanzan,
Si observa el código fuente String # equals y String # contentEquals , está claro que hay dos métodos anulados para
String#contentEquals
uno que tomaStringBuilder
y otroCharSequence
.La diferencia entre ellos
String#contentEquals
arrojará NPE si el argumento proporcionado esnull
peroString#equals
devolveráfalse
String#equals
compara el contenido solo cuando el argumento proporcionado es, de loinstance of String
contrario, volveráfalse
en todos los demás casos, pero por otro ladoString#contentEquals
verifica el contenido de todos los objetos que implementan la interfazCharSequence
.También puede ajustar el código para que
String#contentEquals
devuelva el resultado incorrecto o el resultado que desea anulando elequals
método del argumento pasado como se muestra a continuación, pero no puede hacer esos ajustesString#equals
.El siguiente código siempre producirá
true
siempre ques
contenga cualquiera destring
3 caracteresString#contentEquals
será más lento queString#Equals
cuando el argumento proporcionado esinstance of String
y la longitud de ambosString
es la misma pero el contenido no es igual.Ejemplo si las cadenas son
String s = "madam"
yString argPassed = "madan"
luegos.contentEquals(argPassed)
tomarán casi el doble de tiempo de ejecución en este caso en comparación cons.equals(argPassed)
Si la longitud del contenido no es la misma para ambas cadenas, la función
String#contentEquals
tendrá un mejor rendimiento queString#Equals
en casi todos los casos posibles.Un punto más para agregar a su respuesta
String#contentEquals
de unString
objeto también se comparará con elStringBuilder
contenido y proporcionará el resultado apropiado, mientrasString#Equals
que devolveráfalse
fuente
String
Elequals(Object o)
método de clase solo haceString
comparación. Pero lascontentEquals(CharSequence cs)
comprobaciones para las clases se extienden ,AbstractStringBuilder
es decirStringBuffer
,StringBuilder
y laString
clase también (todas son de tipoCharSequence
).salida:
La salida del primero stmt es
false
porquebuilder
no es de tipoString
de modoequals()
rendimientosfalse
pero loscontentEquals()
controles para el contenido de todo el tipo comoStringBuilder
,StringBuffer
,String
y como el contenido es el mismo, por lo tantotrue
.contentEquals
lanzaráNullPointerException
si el argumento proporcionado esnull
peroequals()
devolverá falso porque equals () verifica por ejemplo Of (if (anObject instance of String)
) que devuelve falso si el argumento esnull
.fuente
contentEquals(CharSequence cs)
:java.lang.CharacterSequence
(por ejemplo,CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)equals(Object anObject)
:java.lang.String
solamenteRTFC :)
Como leer la fuente es la mejor manera de entenderla, comparto las implementaciones de ambos métodos (a partir de jdk 1.7.0_45)
Hay otro método de String # contentEquals ():
fuente
equals()
ycontentEquals()
son dos métodos enString
clase para comparar dosstrings
ystring
conStringBuffer
.Los parámetros de
contentEquals()
sonStringBuffer
yString(charSequence)
.equals()
se usa para comparar dosstrings
ycontentEquals()
se usa para comparar el contenido deString
yStringBuffer
.Método
contentEquals
yequals
sonAquí hay un código que describe ambos métodos.
Salida:
fuente
String # equals toma Object como argumento y comprueba si es una instancia de String object o no. Si el objeto de argumento es String Object, compara el contenido carácter por carácter. Devuelve verdadero en caso de que el contenido de ambos objetos de cadena sea el mismo.
La cadena # contentEquals toma la interfaz CharSequence como argumento. CharSequence se puede implementar de 2 maneras: usando i) la clase String o (ii) AbstractStringBuilder (clase padre de StringBuffer, StringBuilder)
En contentEquals () la longitud se compara antes de cualquier comprobación de instancia de objeto. Si la longitud es la misma, comprueba si el objeto argumento es una instancia de AbstractStringBuilder o no. Si es así (es decir, StringBuffer o StringBuilder), el contenido se verifica carácter por carácter. En caso de que el argumento sea una instancia del objeto String, String # es igual a llamado desde String # contentEquals.
En resumen,
Cadena # igual compara el contenido carácter por carácter en caso de que el argumento sea también un objeto Cadena. Y String # contentEquals compara el contenido en caso de que el objeto de argumento implemente la interfaz CharSequence.
String # contentEquals es más lento en caso de que comparemos dos contenidos de cadena de la misma longitud que String # contentEquals internamente llama a String # igual para el objeto String.
En caso de que intentemos comparar objetos con diferente longitud de contenido (digamos "abc" con "abcd"), String # contentEquals es más rápido que String # igual. Porque la longitud se compara antes de cualquier comprobación de instancia de objeto.
fuente
Los
contentEquals()
cheques método es el contenido son los mismos entre unaString
,StringBuffer
, etc, que algún tipo de secuencia de carbón.fuente
Por cierto, la razón histórica de la diferencia es que String originalmente no tenía superclase, por lo que String.equals () toma un String como argumento. Cuando se introdujo CharSequence como la superclase de String, necesitaba una prueba de igualdad propia que funcionara en todas las implementaciones de CharSequence, y que no colisionaría con los equals () ya en uso por String ... así que obtuvimos CharSequence.contentEquals ( ), que es heredado por String.
Si CharSequence ha estado presente en Java 1.0, probablemente solo tendríamos CharSequence.equals () y String simplemente implementaría eso.
Ah, las alegrías de los lenguajes en evolución ...
fuente