首先这道题目创建了两个Person对象p1,p2,然后set.add添加这两个对象到table数组中,这里是没有问题的,接着通过p1.name改变了p1在table数组中的名字,由AA改为了CC,这里要注意的是,hash值一开始是由1001,"AA"两个属性确定好了的,因此此时在table上的索引位置是1001,“AA”的hash确定好了的,如果将AA改为CC,这里不会涉及到table位置的改变,只是在原来的索引上将AA改为CC就完事了,在table上的索引位置还是名字为AA时的索引位置,但是下一步使用set.remove时,需要根据p1对象的两个属性值来算出hash值,然后根据hash值以及一些算法得到这个hash值对应的table数组上的索引位置,显然这个时候由于name改变了,所以算出来的hash值肯定是不会和没改变前的hash值一样,因此这个新的hash值算出来的索引位置大概率是不会和没改变之前的hash值算出来的索引位置相同,所以根据这个新的hash索引位置去删除对象是不会删除到p1的,因此这一步没有成功。然后往下看,输出set,这时可以输出两个对象,再往下set.add一个1001,"CC"的对象,此时很多人可能就会认为这个对象和我们前面修改后的p1对象重复了,不能添加,其实不是,前面修改后的p1两个属性值确实和这个新添加的对象属性值一样,但是hash值是不一样的,前面的修改后的p1的hash值是1001,