2010-08-31 14 views
7

Quiero demostrar con algunas líneas de código que en Java, para comparar dos cadenas (String), debe usar equals() en lugar del operador ==.Demostración de comparación de cadenas con Java

Aquí es algo que he intentado:

public static void main(String Args[]) { 
    String s1 = "Hello"; 
    String s2 = "Hello"; 

    if (s1 == s2) 
     System.out.println("same strings"); 
    else 
     System.out.println("different strings"); 
} 

me esperaba este resultado: different strings, ya que con la prueba s1 == s2 realidad estoy comparando dos referencias (es decir, direcciones) en lugar del contenido del objet.

Pero en realidad obtuve esta salida: same strings!

Navegar por Internet encontré que algunos implementación Java optimizará el código anterior para que s1 y s2se realidad referencia a la misma cadena.

Bueno, ¿cómo puedo demostrar el problema usando el operador == al comparar cadenas (u objetos) en Java?

+1

En realidad, según el JLS, todos los compiladores de Java deben realizar esa optimización. – Darron

Respuesta

17

El compilador realiza algunas optimizaciones en su caso para que s1 y s2 sean realmente el mismo objeto. Puede solucionarlo utilizando

String s1 = new String("Hello"); 
String s2 = new String("Hello"); 

Luego tiene dos objetos distintos con el mismo contenido de texto.

+0

gracias! ¡No sabía que usar 'new' o no al crear una cadena produciría algo diferente! –

2

Bueno, ¿cómo puedo demostrar el problema usando el operador == al comparar cadenas (u objetos) en Java?

Aquí manera:

String s = "ab"; 
String t = new String("ab"); 
System.out.println(s == t); // false 

También tenga cuidado al comparar las envolturas primitivas y el uso de auto-boxing: Entero (y larga), por ejemplo cachés (! Y reutiliza) los valores de -128. .127. Por lo tanto:

Integer s = -128; 
Integer t = -128; 
System.out.println(s == t); 

imprimirá true, mientras que:

Integer s = -129; 
Integer t = -129; 
System.out.println(s == t); 

impresiones false!

+0

Gracias. No sabía sobre el almacenamiento en caché de los valores -128..127. No estoy seguro de entender la razón por la cual Java hace eso, ¡pero es bueno saberlo! –

+0

@ Jérôme, esto se hace porque los desarrolladores pensaron (piensan) que estos valores se usaban con tanta frecuencia que era beneficioso * no * crear nuevas instancias de estos valores cada vez. Y dado que son inmutables, no puede perjudicar * reutilizar * estas instancias. –

+1

Es un gran ejemplo del patrón Flyweight. – Vivart

0

JAVA mantiene un conjunto de cadenas en el espacio de almacenamiento dinámico, donde intenta tener múltiples referencias para los mismos valores si es posible.

te hicieron por escrito:

String s1 = new String ("Hello"); 
    String s2 = new String ("Hello"); 

que te habría dado la salida:. "Diferentes cadenas" 'nueva' palabra clave crea una nueva referencia de objeto pese a no dar nueva comprueba en primer lugar el grupo de cadena para su existencia .