Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
5年前关闭。
我在HashSet中添加了两个对象并将其删除,但是在上一个s.o.p中,我的大小仍然为1。我同意我已更新了k2的值,但仍未将其添加到我的集合中。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
5年前关闭。
class KeyMaster {
public int i;
public KeyMaster(int i) { this.i = i; }
public boolean equals(Object o) { return i == ((KeyMaster)o).i; }
public int hashCode() { return i; }
}
public class MIt
{
public static void main(String[] args) {
Set<KeyMaster> set = new HashSet<KeyMaster>();
KeyMaster k1 = new KeyMaster(1);
KeyMaster k2 = new KeyMaster(2);
set.add(k1);
set.add(k1);
set.add(k2);
set.add(k2);
System.out.println(set.size()+":");
k2.i = 1; // this is creating another object in HashSet
set.remove(k1);
System.out.println(set.size()+":");
set.remove(k2);
System.out.print(set.size());
}
}
我在HashSet中添加了两个对象并将其删除,但是在上一个s.o.p中,我的大小仍然为1。我同意我已更新了k2的值,但仍未将其添加到我的集合中。
最佳答案
哈希集使用哈希存储和检索对象。当我们在哈希图中添加一个对象时,JVM会寻找哈希码来确定将对象放在内存中的位置。当我们再次检索对象时,将使用哈希码来获取对象的位置。如果在将对象插入到哈希图中之后更改对象,则更新后的对象将具有与原始存储的对象不同的哈希码。就像您更新k2.i = 1的情况一样,k2的哈希码现在将不同于原始k2对象。因此,当您使用更新的k2调用remove时,JVM实际上找不到该对象,因此无法删除。这就是为什么您在最后一个s.o.p中看到大小为1的原因