¿Cuál es la diferencia entre el String#equalsmétodo y el String#contentEqualsmétodo?
152
¿Cuál es la diferencia entre el String#equalsmétodo y el String#contentEqualsmé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 CharSequencela 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 alequalsverificar una coincidencia de tipo exacta conStrings(otras clases podrían ser más flexibles con los tipos en susequalsmé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:equalsmé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.contentEqualsentra. 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, aCharSequencey 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 compararStringBufferyStringBuilderde 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#contentEqualsuno que tomaStringBuildery otroCharSequence.La diferencia entre ellos
String#contentEqualsarrojará NPE si el argumento proporcionado esnullperoString#equalsdevolveráfalseString#equalscompara el contenido solo cuando el argumento proporcionado es, de loinstance of Stringcontrario, volveráfalseen todos los demás casos, pero por otro ladoString#contentEqualsverifica el contenido de todos los objetos que implementan la interfazCharSequence.También puede ajustar el código para que
String#contentEqualsdevuelva el resultado incorrecto o el resultado que desea anulando elequalsmétodo del argumento pasado como se muestra a continuación, pero no puede hacer esos ajustesString#equals.El siguiente código siempre producirá
truesiempre quescontenga cualquiera destring3 caracteresString#contentEqualsserá más lento queString#Equalscuando el argumento proporcionado esinstance of Stringy la longitud de ambosStringes 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#contentEqualstendrá un mejor rendimiento queString#Equalsen casi todos los casos posibles.Un punto más para agregar a su respuesta
String#contentEqualsde unStringobjeto también se comparará con elStringBuildercontenido y proporcionará el resultado apropiado, mientrasString#Equalsque devolveráfalsefuente
StringElequals(Object o)método de clase solo haceStringcomparación. Pero lascontentEquals(CharSequence cs)comprobaciones para las clases se extienden ,AbstractStringBuilderes decirStringBuffer,StringBuildery laStringclase también (todas son de tipoCharSequence).salida:
La salida del primero stmt es
falseporquebuilderno es de tipoStringde modoequals()rendimientosfalsepero loscontentEquals()controles para el contenido de todo el tipo comoStringBuilder,StringBuffer,Stringy como el contenido es el mismo, por lo tantotrue.contentEqualslanzaráNullPointerExceptionsi el argumento proporcionado esnullperoequals()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.StringsolamenteRTFC :)
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 enStringclase para comparar dosstringsystringconStringBuffer.Los parámetros de
contentEquals()sonStringBufferyString(charSequence).equals()se usa para comparar dosstringsycontentEquals()se usa para comparar el contenido deStringyStringBuffer.Método
contentEqualsyequalssonAquí 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