Java ofrece varias maneras de comparar cadenas, cada una con sus propias fortalezas y debilidades. El mejor método depende de si necesita una comparación sensible a mayúsculas y minúsculas, si está comprobando la igualdad o si necesita determinar el orden lexicográfico. Esta guía aclara los enfoques más comunes.
Tabla de contenido
- Usando el método
compareTo()
- El operador
==
- El método
equals()
- Sensibilidad a mayúsculas y minúsculas y
equalsIgnoreCase()
- El método
contentEquals()
1. Comparando cadenas con compareTo()
El método compareTo()
ofrece una comparación lexicográfica. Devuelve:
0
: Si las cadenas son iguales.- Un valor negativo: Si la cadena que invoca precede a la cadena de argumento lexicográficamente.
- Un valor positivo: Si la cadena que invoca sigue a la cadena de argumento lexicográficamente.
Esta comparación distingue entre mayúsculas y minúsculas; las letras mayúsculas preceden a las minúsculas.
String str1 = "apple";
String str2 = "banana";
String str3 = "Apple";
int result1 = str1.compareTo(str2); // result1 será negativo
int result2 = str1.compareTo(str3); // result2 será negativo (distingue mayúsculas y minúsculas)
int result3 = str1.compareTo("apple"); // result3 será 0
2. El operador ==
El operador ==
compara referencias, no el contenido de la cadena. Comprueba si dos variables de cadena apuntan a la misma ubicación de memoria. Este suele no ser el comportamiento deseado para comparar valores de cadena.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); // A menudo true debido a la internamiento de cadenas
System.out.println(str1 == str3); // false (objetos diferentes)
Si bien str1 == str2
a menudo devuelve true
debido al internamiento de cadenas de Java, confiar en esto no es fiable. Siempre use equals()
para la comparación de contenido.
3. El método equals()
El método equals()
es el enfoque recomendado para comparar el contenido de las cadenas. Compara caracteres, sin tener en cuenta las ubicaciones de memoria.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
4. Sensibilidad a mayúsculas y minúsculas y equalsIgnoreCase()
equals()
distingue entre mayúsculas y minúsculas. «hello» y «Hello» se consideran diferentes. Para comparaciones que no distinguen entre mayúsculas y minúsculas, use equalsIgnoreCase()
.
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
5. El método contentEquals()
contentEquals()
es similar a equals()
, pero permite comparar una cadena con otros objetos CharSequence
(como StringBuffer
o StringBuilder
).
String str1 = "hello";
StringBuffer str2 = new StringBuffer("hello");
System.out.println(str1.contentEquals(str2)); // true
Esto ofrece flexibilidad, pero para comparaciones simples de cadena a cadena, equals()
se prefiere por su legibilidad.
En resumen, seleccione el método apropiado según sus necesidades: compareTo()
para el orden lexicográfico, equals()
para la igualdad de contenido sensible a mayúsculas y minúsculas, equalsIgnoreCase()
para la igualdad insensible a mayúsculas y minúsculas, y contentEquals()
para comparar cadenas con otros objetos CharSequence
. Evite usar ==
para comparar el contenido de las cadenas.