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'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值