java-----HashSet 经典面试题

先看代码如下 看看各位对于四个print输出的结果是否存有疑惑

public void test() {
        Set set = new HashSet();
        Person p1=new Person("a",1);
        Person p2=new Person("b",2);
        set.add(p1);
        set.add(p2);
        System.out.println(set);
        p1.setName("c");
        set.remove(p1);
        System.out.println(set);
        set.add(new Person("c",1));
        System.out.println(set);
        set.add(new Person("a",1));
        System.out.println(set);

    }

分析这道题时 我们首先需要明白的是 HashSet的存储当时,它实现通过对象的hashCode方法找到存储的位置后再根据对象的equals方法来尽心内容的比较(所以HashSet存储的是同一类对象)

首先 第一个print想必给我一定都明白(记得重写对象的toString方法),然后分析第二个print为什么还是两个对象呢?不是已经删除了一个吗?

这是因为我们在删除p1前对p1的name进行了改变,所以在进行set.remove(p1);操作时,会先调用hashCode方法找到p1对象所在的位置(hashCode的值是根据对象的属性值来确定的,想了解详情的小伙伴可以去看看重写的HashCode代码哦),因为对象的属性内容发生了变化,hash值也就有了变化,找的位置也就不一样,所以对于原p1对象没有影响.

接下来我们看第三个print输出,此时的set又进行了add操作,此时你可能又有疑惑了,怎么添加了两个属性内容一样的对象呢,set不是添加不可重复的吗, 这里的原因是我们在进行添加时是按照new Person("c",1)的hashCode值进行存储的,而p1是按照new Person("a",1)的hashCode值进行存储的,他还在原来的为位置,只是他的name属性进行了改变。

第四个print 小伙伴们应该都清楚了吧(注意我开始时说的话),我就不讲了,大家思考一下吧。

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值