¿Por qué tenemos equals()
y equalsIgnoreCase()
como dos métodos diferentes, cuando equals()
podría haber sido sobrecargado con un argumento especial ignoreCase
para proporcionar funcionalidad equalsIgnoreCase()
?iguales (...) y equalsIgnoreCase (...)
Respuesta
El método equals()
se hereda de Object
, por lo que no debe modificarse su firma. equals()
a menudo se puede utilizar sin conocer realmente la clase concreta del objeto, p. al iterar a través de una colección de objetos (especialmente antes de los genéricos de Java 5). Entonces, ni siquiera verías el otro equals()
sin bajar tu objeto a String
primero.
Esta fue una elección de diseño de los creadores de Java para usar el modismo de usar equals()
utilizable de la misma manera para todos los objetos.
Por otra parte, la OMI
if (string1.equalsIgnoreCase(string2)) ...
es más fácil de leer, por tanto, menos propenso a errores que
if (string1.equals(string2, true)) ...
Por supuesto, en sus propias clases que son libres de añadir una equals()
con diferentes firmas (en parte superior de la norma equals()
, eso es).
Porque el método equals()
se hereda de Object.
Si lo hicieron como sugieres entonces tendríamos algo como esto:
public final class String {
public boolean equals() { ... }
public boolean equals (boolean ignoreCase) { ... }
}
Y sin necesidad de leer la documentación que sería imposible de entender qué método equals()
(que sin parámetros) hacer.
Eso es un patrón perfectamente API común. El primer formulario usa un valor predeterminado para el argumento. Y si es imposible saber cuál es el valor predeterminado sin leer la documentación, entonces lee la documentación. – skaffman
@skaffman: buenos ejemplos, por favor – Roman
OK, 'java.lang.String' tiene varios constructores, muchos de los cuales son versiones más simples de otros constructores, y proporcionan valores predeterminados cuando los llaman. El comportamiento no es obvio sin mirar el javadoc. – skaffman
Es absolutamente posible hacer lo que usted sugiere, pero los diseñadores del lenguaje elegido para ir a otro lado y, por tanto, tenemos equalsIgnoreCase(otherString)
en lugar de decir equals(otherString, StringConstants.IGNORE_CASE)
o equals(otherString, true)
.
equalIgnoreCase()
se utiliza para ignorar la mayúscula de mi String
. Pero el equals()
es sólo devuelve true
, mientras que ser el mismo caso de string
ex,
String value="java";
if(value.equals("JAva")
{
System.out.println("Return True");
}
else
{
System.out.println("Return False");
}
Respuesta: Devuelve False
pero el otro es,
if(value.equalIgnoreCase("JAva")
{
System.out.println("Return True");
}
else
{
System.out.println("Return False");
}
Resp: Devuelve True
Lea y COMPRENDA la pregunta antes de publicar una respuesta. – missingfaktor
Creo que eligieron una de las alternativas. .NET eligió el otro. StringComparison.InvariantCultureIgnoreCase etc.
definitivamente lo que usted está sugiriendo y [aún mejor lo que] .NET implementado habría sido más flexible para diferentes culturas, etc. De hecho, ni siquiera sé lo que la cultura que utilizan en este caso ignorar . Creo que la cultura actual.
La prueba principal al reemplazar un método con parámetros adicionales es que esperaría que cualquier método de anulación hiciera exactamente lo mismo que el método que está anulando. Igual(), derivado de Objeto tiene un contrato que debe seguir. Dos objetos que son iguales() deben tener hashcodes idénticos. No creo que dos objetos que no distinguen entre mayúsculas y minúsculas igual tengan el mismo código hash, por lo que creo que anular igual aquí es lo incorrecto.
// Demonstrate equals() and equalsIgnoreCase().
class equalsDemo {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Good-bye";
String s4 = "HELLO";
System.out.println(s1 + " equals " + s2 + " -> " +
s1.equals(s2));
System.out.println(s1 + " equals " + s3 + " -> " +
s1.equals(s3));
System.out.println(s1 + " equals " + s4 + " -> " +
s1.equals(s4));
System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " +
s1.equalsIgnoreCase(s4));
}
}
La salida del programa se muestra aquí:
Hello equals Hello -> true
Hello equals Good-bye -> false
Hello equals HELLO -> false
Hello equalsIgnoreCase HELLO -> true
- 1. que es más rápido, equalsIgnoreCase o compareToIgnoreCase
- 2. ¿CDN y Cloud son iguales?
- 3. lo hace | = (solo tubo iguales) y Y = (signo único iguales) significa
- 4. ¿Por qué arr y & arr son iguales?
- 5. varchar (20) y varchar (50) son iguales?
- 6. NHibernate: Razones para anular Iguales y GetHashCode
- 7. ¿Son la semántica y la sintaxis iguales?
- 8. iguales de Java 7() y() deepEquals
- 9. Son "{Binding Path =.}" Y "{Binding}" realmente iguales
- 10. LINQ y distinta, la aplicación de los iguales y GetHashCode
- 11. ¿Son dos funciones iguales?
- 12. ¿Deberíamos siempre anular iguales?
- 13. El programa y los datos son iguales en Prolog?
- 14. Diferencia entre operadores "no iguales" <> y! = En PHP
- 15. Cadena Compara dónde nulo y vacío son iguales
- 16. ¿Las referencias y punteros son iguales con respecto al polimorfismo?
- 17. Son "(función() {})()" y "(función() {}())" funcionalmente iguales en JavaScript?
- 18. ¿se pueden usar getters en iguales y hashcode?
- 19. ¿Son "div> p" y "div p" iguales?
- 20. cumplir "iguales" en una interfaz
- 21. ¿Cómo almacenar datos "iguales a"?
- 22. ¿Por qué el operador! = De Python piensa que los argumentos son iguales y no iguales al mismo tiempo?
- 23. Internos de "iguales" en .NET
- 24. Usar operadores iguales en C#
- 25. Java HashMap.containsKey() no llamar iguales()
- 26. Java's equalsIgnoreCase falla con ß ("Sharp S" usado en el alfabeto alemán)
- 27. Ayudantes de implementación de métodos iguales (C#)
- 28. Comparando dos números que son aproximadamente iguales
- 29. Determine si dos árboles binarios son iguales
- 30. ¿Dos signos iguales en una línea?
pero veo otras implementaciones como 'compareTo()' y 'compareToIgnoreCase()' también, que no tienen conexión con la clase 'Object' per se. –
@Vaibhav Un buen diseño de API es consistente con la denominación (entre otras cosas). Si los métodos que hacen cosas similares se nombran de acuerdo con un patrón similar, la API es más fácil de aprender y usar, lo que también reduce la posibilidad de errores. Además, mi argumento de legibilidad anterior se aplica a 'compareToIgnoreCase()' así como a 'equalsIgnoreCase()'. –