đây là mã của tôi:HashSet chứa phương pháp, kỳ lạ hành vi
public class testGui {
public static void main(String[] arg){
class TESTS{
String t;
public TESTS(String t){
this.t = t;
}
@Override
public boolean equals(Object x){
System.out.println("My method is called...");
if(x instanceof TESTS){
TESTS zzz = (TESTS) x;
return zzz.t.compareTo(t)==0;
}
else return false;
}
}
HashSet<TESTS> allItems = new HashSet<TESTS>();
allItems.add(new TESTS("a"));
allItems.add(new TESTS("a"));
System.out.println(allItems.contains(new TESTS("a")));
}
}
Tôi không hiểu tại sao HashSet chứa phương pháp không được gọi bằng phương pháp của tôi như mentionned trong thông số kỹ thuật của họ:
Nhiều chính thức , thêm phần tử được chỉ định, o, vào bộ này nếu tập hợp này không chứa phần tử e sao cho (o == null? e == null: o.equals (e))
Mã của tôi trả về false và không đi vào phương thức equals của tôi.
Cảm ơn bạn rất nhiều vì đã trả lời!
Chúng sẽ không được coi là không bằng nhau. Nó chỉ là HashSet thậm chí sẽ không gọi phương thức equals bởi vì nó chỉ làm cho hashCodes dẫn đến cùng một nhóm. Và chỉ ghi đè hashCode không có bất kỳ ý nghĩa nào, vì HashSet sẽ luôn gọi equals cho các đối tượng có cùng hashCodes. –
@JB, vâng, thực tế là chúng dẫn đến các nhóm khác nhau có nghĩa là chúng được coi là 'không công bằng' (được coi là các đối tượng khác nhau). Tôi không đề cập đến phương thức 'equals' khi tôi sử dụng thuật ngữ đó. Tôi cũng đồng ý chỉ ghi đè 'hashCode' là vô lý, đó là lý do tại sao tôi khuyến khích mạnh mẽ chống lại nó. Tuy nhiên, nó không phá vỡ hợp đồng. –
Nó sẽ là tốt đẹp nếu các tài liệu java đề cập rằng hashcode được gọi là đầu tiên. Tôi đã bị đốt cháy bởi vấn đề này trong java 5. – Aaron