java hashset底层_Java集合系列之八:HashSet底层原理

保证唯一性

HashSet是调用的HashMap的put()方法,而put()方法中有这么一行逻辑,如果哈希值和key都一样,就会直接拿新值覆盖旧值,而HashSet就是利用这个特性来保证唯一性。

if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))

e = p;

所以在存放对象的时候需要重写hashCode()和equals()方法,因为就是用这两个方法来判断唯一性的,否则就会出现下面这样的情况,创建两个属性一样的对象,放入HashSet中会发现重复了,那是因为创建两个对象肯定哈希值是不一样的,所以需要自己重写hashCode()和equals()。

public class TestVo {

int id;

String name;

public TestVo(int id, String name) {

this.id = id;

this.name = name;

}

@Override

public String toString() {

return "TestVo{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

}

public static void main(String[] args){

HashSet set = new HashSet();

TestVo testVo1 = new TestVo(1,"a");

TestVo testVo2 = new TestVo(1,"a");

set.add(testVo1);

set.add(testVo2);

Iterator iterator = set.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

}

}

// 输出结果

TestVo{id=1, name='a'}

TestVo{id=1, name='a'}

重写hashCode()和equals()方法,都基于id来判断,这样重复``id的就不会重复存入了,所以存入对象的时候是可以自己设置按什么规则来去重的。

@Override

public int hashCode() {

return id;

}

@Override

public boolean equals(Object obj) {

return obj.equals(id);

}

}

// 输出结果

TestVo{id=1, name='a'}

你可能感兴趣的:(java,hashset底层)