HashSet set = new HashSet(); Person p1 = new Person("AA",1001); Person p2 = new Person("BB",1002); set.add(p1); set.add(p2); p1.name = "CC"; set.remove(p1);//remove是通过调用hashCode方法计算哈希值找到要删除的索引位置进行删除,这时p1的name变了,也就是hashCode方法返回的是CC的哈希值,其索引位置与AA不同,所以删除不成功 System.out.println(set);//还是输出两个 CC 和 BB set.add(new Person("CC",1001));//这个时候添加,当然添加也是通过hashCode计算哈希值,找到底层数组所在的索引位置,然后发现为空,添加成功 System.out.println(set);//输出三个 其中两个CC 一个BB set.add(new Person("AA",1001));//同理,先用hashCode计算哈希值,找到其索引位置,发现其位置上有元素,则再采用equals方法比对,发现equals返回false,则添加成功 System.out.println(set);//输出四个