用HashSet存储不重复的对象
直接进入主题,先来创建一个类: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方法。
就这些了。。。