2012-06-20 9 views

Respuesta

31

Debido StringBuffer es mutable, y su uso principal es para la construcción de cuerdas. Si desea comparar contenido, llame al StringBuffer#toString() y compare el valor devuelto.

En general, no es útil anular hashCode() para objetos mutables, ya que la modificación de un objeto que se utiliza como clave en HashMap podría hacer que el valor almacenado se "pierda".

+0

¿Qué significa mutable aquí? – Saravanan

+4

Investiga un poco si no entiendes los principios básicos: http://stackoverflow.com/questions/3554192/what-is-a-mutable-class-in-oop –

+1

Con todo respeto, no estoy de acuerdo con tu afirmación _No es generalmente útil sobrescribir hashCode() para objetos mutables ..._ – Shahzeb

5

En realidad detrás de esto todo depende del valor del código hashcode. Para entender este concepto permite tomar un ejemplo:

String str1 = new String("sunil"); 
String str2 = new String("sunil"); 

HashMap hm = new HashMap() 
hm.put(str1,"hello"); 
hm.put(str2,"bye"); 

hm definitiva:

hm = { sunil=bye } 

En el código anterior, cadena1 y cadena2 son dos objetos String diferentes. Debe ser agregado en HashMap? La respuesta es NO. Porque antes de insertar/poner valor en HashMap, internamente comprueba y compara el valor hashCode de str1, str2. Ambos devuelven el mismo valor de hascode porque la clase String anula el método equals() y hashcode(). Por lo tanto, al ejecutar hm.put(str2,"bye");, la primera clave se sobrescribirá con un nuevo valor. Ahora intente esto:

StringBuilder sb1 = new StringBuilder("sunil"); 
StringBuilder sb2 = new StringBuilder("sunil"); 

HashMap hm = new HashMap() 
hm.put(sb1,"hello");//sb1 and sb2 will return different HashCode 
hm.put(sb2,"bye");// StringBuffer/StringBuilder does not override hashCode/equals methods 

hm definitiva:

{sunil=hello, sunil=bye} 

Tanto valor se añadirá en Hashmap porque SB1 y SB2 tanto vuelve diferente código hash. StringBuilder/StringBuffer no anula el método equals() y hashCode().

Sun Microsystem quería que el programador para permitir la adición de 2 especie de cadena de valores diferentes en Hashtable o cualquier otro Colecciones Hash gustos (HashSet, HashMap ...), esa es la razón hashCode() y equals() no se invalida intencionadamente en StringBuffer , Clase StringBuilder.

+0

'Sun Microsystem quería que el programador permitiera agregar 2 tipos diferentes de valores de cadena en Hashtable ...' Eso no es cierto, javadocs para ['Hashtable'] (https: // docs. oracle.com/javase/8/docs/api/java/util/Hashtable.html) y ['Map'] (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html) desalientan activamente el uso de objetos con un contrato 'equals/hashcode' roto como claves. Almacenar objetos 'StringBuilder' en un mapa no es útil porque no podrá obtener el valor con la clave a menos que tenga su objeto original. –

-2

Porque StringBuffer es mutable. Con el ejemplo, pruebe esto :)

package test; 

import java.util.HashMap; 

public class CheckHashcodeEquals { 

    public static void main(String[] args) { 

     /* 
     * String class override equals() and hashcode() method thats way 
     * override value of HashMap 
     */ 
     String s1 = new String("Arya"); 
     String s2 = new String("Arya"); 
     HashMap hm = new HashMap<>(); 
     hm.put(s1, "A1"); 
     hm.put(s2, "A2"); 
     System.out.println(hm); /* Output: {Arya=A2} */ 

     /* 
     * String class does not override equals() and hashcode() method thats 
     * way insert duplicate value 
     */ 
     StringBuffer sb1 = new StringBuffer("Arya"); 
     StringBuffer sb2 = new StringBuffer("Arya"); 
     HashMap hm2 = new HashMap<>(); 
     hm2.put(sb1, "A1"); 
     hm2.put(sb2, "A2"); 
     System.out.println(hm2); /* Output: {Arya=A2, Arya=A1} */ 
    } 

} 
+0

Este ejemplo demuestra que 'StringBuffer' no anula' equals' y 'hashcode', pero no muestra por qué. La respuesta en sí ('Porque StringBuffer es mutable') se copia de una respuesta anterior. –

Cuestiones relacionadas