2010-12-19 5 views

cevap

9

Bunu yapar. the docs

public boolean equals(Object o)

eşitlik bu set ile belirtilen nesneyi karşılaştırır bakın. Verilen nesne aynı zamanda bir set ise true döndürür, iki set aynı boyuta sahiptir ve verilen kümenin her üyesi bu sette bulunur. Bu, Eşit yönteminin Set arabiriminin farklı uygulamalarında düzgün şekilde çalışmasını sağlar. Bu uygulama, önce belirtilen nesnenin bu ayarlanmış olup olmadığını kontrol eder; eğer öyleyse, doğru döner. Ardından, belirtilen nesnenin boyutu, bu kümenin boyutuna eşit olan bir kümedir; değilse, yanlış döndürür. Eğer öyleyse, returnAll ((Koleksiyon) o) değerini döndürür.

Yani aslında bu (containsAll(..) tarafından çağrılır) contains uygulanmasına dayanır. HashSet için (en azından), aradığınız şey budur.

4

Varsayılan davranış budur, görmüyorsanız ne yaparsanız o zaman hashCode'u da geçersiz kıldığınızı kontrol edin. Örnek için aşağıdaki kodu bakınız:

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); 
    } 
} 

Bu çıkışlar:

gerçek

+1

teşekkürler @MrWiggles. Hashing'i geçersiz kılmak benim problemimi çözdü (hashCode ve equals öğelerinden birini geçersiz kılmadı). – user495285