Pregunta

Siempre que uso el método equals () con dos objetos StringBuffer diferentes, obtengo el resultado como falso, pero cuando uso el método equals () con dos objetos String diferentes, obtengo el resultado como verdadero. ¿Por qué?

    String s=new String("434");
    String s1=new String("434");

    System.out.println(s.equals(s1));//true

   StringBuffer s=new StringBuffer("434");
   StringBuffer s1=new StringBuffer("434");

   System.out.println(s.equals(s1));//false
¿Fue útil?

Solución

StringBuffer no anula equals (). Como tal, se llama Object.equals (), que compara la identidad del objeto (la dirección de memoria). La cadena anula los iguales y compara el contenido.

Otros consejos

StringBuffer no anula Object # equals () , por lo que experimenta comprobaciones basadas en identidad de referencia en lugar de valor cheques basados. Como estas instancias StringBuilder son distintas, cada una con diferentes ubicaciones de memoria, la implementación base Object # equals () siempre devolverá false.

Aquí está la definición a partir de Java 6:

public boolean equals(Object obj) {
  return (this == obj);
}

¿Ves el problema?

Al menos en mi versión del JDK (Sun 1.6), StringBuffer no implementa un método equals (). Esto significa que hereda el método equals () de Object, que es lo mismo que ==

Si realmente quiere probar la igualdad de dos StringBuffers, puede llamar a x.toString (). equals (y.toString ())

Si lo que está buscando hacer es comparar las representaciones de cadena de los dos objetos StringBuffer, entonces lo que quiere hacer es:

StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
  // whatever you want to do if they're equal
} else {
  // whatever you want to do if they're not
}

De lo contrario, está comparando la igualdad de los dos objetos StringBuffer , no su contenido; en otras palabras, ejecutar Object # equals (), no (el inexistente) StringBuffer # equals ().

equals solo devuelve verdadero en los objetos StringBuffer cuando los dos objetos son iguales. Para comparar StringBuffers de la manera que desee, use esto:

System.out.println(s.toString().equals(s1.toString());

String s.equals usará la tabla de cadenas para comparar las cadenas reales donde, como StringBuffer sb.equals, solo usará la implementación predeterminada del método equals y solo comparará los punteros de objeto.

StringBuffer no tiene su propia implementación del método equals, hereda el método equals () de la clase de objeto, por lo tanto, los valores hash se comparan en lugar de comparar el contenido real en el stringBuffer. Por lo tanto, tenemos que convertirlo explícitamente en un objeto de cadena que proporcione la implementación del método equals ().

La semántica del objeto String es tal que si alguna vez se observa que dos instancias contienen la misma secuencia de caracteres, siempre contendrán la misma secuencia de caracteres y uno podría, al menos desde el punto de vista del objeto String en sí mismo: reemplace todas las referencias a una de las cadenas con referencias a la otra sin cambiar la semántica del programa. Dichas instancias pueden considerarse equivalentes, porque a efectos prácticos, la única información encapsulada en una instancia de String es la secuencia de caracteres contenidos en la instancia de destino.

Por el contrario, una variable de tipo StringBuffer encapsula no solo una secuencia de caracteres, sino también la identidad de una instancia particular . Si dos variables se refieren a la misma instancia, cambiar a la instancia a la que hace referencia una variable afectará a la instancia a la que hace referencia la otra (ya que es la misma instancia). Si se refieren a instancias diferentes, los cambios en la instancia a la que hace referencia una no afectarán a la instancia a la que hace referencia la otra. La decisión de no anular StringBuffer de Java equals no fue resultado de la pereza, sino que se basó en el hecho de que los objetos StringBuffer tienen un identidad significativa e instancias disjuntas siempre tienen identidades diferentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top