2010-12-19 13 views

Respuesta

9

Cada hijo de AbstractSet hace eso. Ver the docs

public boolean equals(Object o)

compara el objeto especificado con este conjunto por la igualdad. Devuelve verdadero si el objeto dado también es un conjunto, los dos conjuntos tienen el mismo tamaño, y cada miembro del conjunto dado está contenido en este conjunto. Esto asegura que el método equals funciona correctamente en diferentes implementaciones de la interfaz Set. Esta implementación primero verifica si el objeto especificado es este conjunto; si es así, devuelve verdadero. Luego, verifica si el objeto especificado es un conjunto cuyo tamaño es idéntico al tamaño de este conjunto; si no, devuelve falso. Si es así, devuelve containsAll ((Collection) o).

En realidad, esta se basa en la aplicación contains (que se invoca por containsAll(..)). Para HashSet (al menos) esto es lo que está buscando.

4

Este es el comportamiento predeterminado, si no es lo que está viendo, entonces compruebe que está anulando hashCode también. Ver el siguiente código de ejemplo:

public static void main(String[] args) { 
    Set<Item> items1 = new HashSet<Item>(); 
    items1.add(new Item("item 1")); 
    items1.add(new Item("item 2")); 

    Set<Item> items2 = new HashSet<Item>(); 
    items2.add(new Item("item 1")); 
    items2.add(new Item("item 2")); 

    System.out.println(items1.equals(items2)); 
} 

private static class Item { 
    private String id; 

    public Item(String id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     return id.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return id.equals(((Item)obj).id); 
    } 
} 

Este salidas:

verdaderos

+1

, gracias @MrWiggles. La anulación de hashCode resolvió mi problema (anulando uno de hashCode e iguales no funcionó). – user495285

Cuestiones relacionadas