2010-01-06 13 views

Respuesta

27

El método de la StringBufferequals no se reemplaza de Object, por lo que es apenas referencia igualdad, es decir, lo mismo que usar ==. Sospecho que la razón para esto es que StringBuffer es modificable, y anular equals es principalmente útil para las clases de valor que podría querer usar como claves (aunque las listas también tienen una equals y StringBuffer reemplazadas es una especie de lista, entonces esto es un poco inconsistente).

18

Está comparando las referencias a los objetos StringBuffer en lugar de las cadenas reales dentro de StringBuffer.

System.out.println(sb1.toString().equals(sb2.toString())) volvería verdadero y supongo que esto es lo que esperabas o querías lograr.

2

StringBuffer parece no tener equals método propio, por lo que mi primera conjetura sería que StringBuffer hereda el método de equalsObject, que compara el uso de sb1 == sb2. Por lo tanto, ambos métodos producen el mismo resultado.

2

ambos comparan dos referencias a objetos (sb1 es uno, y sb2 es el segundo), por lo tanto, ambos son diferentes.

si usted está tratando de comparar el contenido - método de uso compareTo (...) en cadena clase - es decir - En primer lugar obtener cadena contenido de StringBuffer utilizando el método toString() (.toString(). compareTo).

Ps. a partir de JDK 5, hay otra clase mucho más rápida que se comporta exactamente como StringBuffer - es StringBuilder , y también es , pero no es seguro para subprocesos.

StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 

System.out.println(sb1.toString().compareTo(sb2.toString())); 
+0

StringBuidler no es seguro para nada por lo que sé – Yaneeve

+0

StringBuilder no es seguro para subprocesos. Desde los documentos SDK en StringBuilder: "compatible con StringBuffer, pero con ** sin garantía de sincronización **", del párrafo de introducción aquí: http://java.sun.com/j2se/1.5.0/docs/api/ java/lang/StringBuilder.html –

+0

por supuesto, mi mal. lea el documento de StringBuffer demasiado rápido, TI se complementa con StringBuilder, por lo tanto, está diseñado para ser utilizado por un único hilo. lo siento por eso. – mkolodziejski

4

La respuesta simple es que StringBuffer (y StringBuilder) no redefinen la semántica de base de Object.equals(). Entonces equals en un StringBuffer simplemente comparará referencias de objetos.

De hecho, String, StringBuffer, StringBuilder y CharBuffer toda implementar la interfaz CharSequence, y el Javadoc para esta interfaz dice esto:

Esta interfaz no refina los contratos generales de los métodos equals y hashCode. El resultado de comparar dos objetos que implementan CharSequence es, en general, indefinido. Cada objeto puede ser implementado por una clase diferente, y no hay garantía de que cada clase sea capaz de probar sus instancias para la igualdad con las de la otra. Por lo tanto, es inapropiado utilizar instancias arbitrarias de CharSequence como elementos en un conjunto o como claves en un mapa.

0

Preguntándose por qué StringBuffer no anula el método equals. Probablemente porque el contenido del objeto se obtiene mediante el método toString() y que tiene el método deseado.

5
1. System.out.println(sb1 == sb2); 

StringBuffer de igual método devuelve true sólo cuando un objeto StringBuffer se compara consigo mismo. Devuelve falso cuando se compara con cualquier otro StringBuffer, incluso si los dos contienen los mismos caracteres.

Esto se debe a "==" comprueba la igualdad de referencia y ya que ambos SB1 y SB2 son diferentes referencias de objetos, por lo que la salida en este caso es "falsa"

embargo, si usted quiere comprobar si el contenido es iguales en estos dos objetos StringBuffer, puede utilizar esto:

sb1.toString().equals(sb2.toString()) 

2. System.out.println(sb1.equals(sb2)); 

esto está dando salida como "falso" porque .equals método() no ha sido anulado en la clase StringBuffer. Entonces está usando el método .equals() de su clase padre "Object". En la clase de objeto, se ha escrito .equals() para verificar la igualdad de referencia.

Tenga en cuenta que sb3.equals (sb4) devolverá "verdadero" en caso de Cadena. Porque el método .equals() ha sido anulado en la clase String para verificar y hacer coincidir el contenido de dos cadenas diferentes.

0

Stringbuffer's equals() no se reemplaza. No compara valores, solo compara asignaciones de valores de referencia. Es por eso que estás obteniendo información falsa ya que ambos se están refiriendo a diferentes objetos.

Cuestiones relacionadas