Set集合实现元素不重复原理

众所周知,set内容不重复。以hashSet为例,会使用对象的hashCode()与equals()来判断存入的对象是否相同。流程如下:
要存入元素,内存中开设空间,每个空间都会有对应的Hash Code,这些空间成为哈希桶(Hash Bucket)。
这里写图片描述
对想要存入HashSet回调用对象的hashCode()获取对应的哈希值,并尝试放入对应的哈希桶中,如果哈希桶中没有对象,则直接放入,如果有,会再调用对象的equals()比较。
这里写图片描述
桶中的对象调用equals()与要传入的对象进行比较,若比较结果为false,则表示两个对象非重复,可以存入,若结果为true,表示两个对象相同,不可存入。

例:
学生类(Student),为了防止收集重复对象,在Student类中复写hashCode()和equals():

 class Studen{
    private String name ;//姓名
    private int age;//年龄

    public int hashCode(){
        return name.hashCode()+age*33;
    }       
    public boolean equals(Object obj){
        if(!(obj instanceof Student))
            throw new ClassCastException("类型不匹配");
        Student s=(Student) obj;
        return this.name.equals(s.name) &&this.age==s.age;          
    }
}

如果之后出现重复对象想要被收集时,要存入对象便会和已存在容器内的对象比较,如果相同则不能再存入。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值