直接進入主題,先來創建一個類:Bean
public class Bean { private int id; private String name; public Bean() { super(); } public Bean(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { if(!(obj instanceof Bean)) { return false; } Bean b = (Bean)obj; if(this.id == b.id) { return true; } return false; } @Override public int hashCode() { return id; } }
可以看出類Bean與普通的JavaBean相比,多了2個方法,即重寫了Object類的equals和hashCode方法,這里讓Bean的實例,只要是id相同就認為是相同的實例,當然也可以是其他,這就要看具體需求,但必須保證當2個對象的hashCode方法的返回值相同時,它們的equals方法也的返回值要是true,這樣才能保證不重復。下面來測試一下:
public class HashSetTest { @Test public void test01() { Set<Bean> set = new HashSet<>(); Bean b1 = new Bean(1,"123"); Bean b2 = new Bean(2,"456"); set.add(b1); set.add(b2); Bean b3 = new Bean(1,"789"); Bean b4 = new Bean(2,"012"); set.add(b3); set.add(b4); System.out.println(set.size()); } }
運行結果是:2
並且變量set中存放的是對象吧b1和b2,因為在添加對象b3和b4時,首先會調用hashCode方法,若返回的數,集和中已經存在hashCode相同的對象,那么對調用equals方法,若equals方法返回true,則放棄添加,返回false,反之。
注意必須重寫Object類的方法,即形參是Object類型,而不能添加類似下面的equals方法:
public boolean equals(Bean b) { if(this.id == b.id) { return true; } return false; }
若是這種寫法,打斷點是進不去的,也就是說當hashCode相同時,不會調用該方法,而是調用Object的equals方法。
就這些了。。。