java.util.Set 中的重复元素
java.util.Set
实现将删除重复的元素。
如何在 内部删除重复元素?java.util.Set
java.util.Set
实现将删除重复的元素。
如何在 内部删除重复元素?java.util.Set
实际上,来自源代码的AFAIK Java中的大多数实现甚至不检查该元素是否已经包含。Set
他们只是总是在保存集合元素的内部结构上执行,并让该对象处理重复情况。add()
例如: 调用内部,如果重复,则仅插入新对象并覆盖旧条目。HashSet
put(K,V)
HashMap
稍微阅读一下你的问题,我猜你正在看到一个奇怪的行为(通常是每个人默认使用的)。java.util.HashSet
它的合约可以像这样在两次中得到相同的对象:java.util.Set
java.util.HashSet
import java.util.HashSet;
import java.util.Set;
public class SetTest
{
public static void main(String[] args)
{
MyClass myObject = new MyClass(1, "testing 1 2 3");
Set<MyClass> set = new HashSet<MyClass>();
set.add(myObject);
myObject.setHashCode(2);
set.add(myObject);
System.out.println(set.size()); // this will print 2.
}
private static class MyClass
{
private int hashCode;
private String otherField;
public MyClass(int hashCode, String otherField)
{
this.hashCode = hashCode;
this.otherField = otherField;
}
public void setHashCode(int hashCode)
{
this.hashCode = hashCode;
}
public boolean equals(Object obj)
{
return obj != null && obj.getClass().equals(getClass()) && ((MyClass)obj).otherField.equals(otherField);
}
public int hashCode()
{
return hashCode;
}
}
}
在@jitter的指针并查看源之后,您可以看到为什么会发生这种情况。
就像@jitter说的,在内部使用。当哈希在第一个和第二个添加之间发生变化时,将在 中使用不同的存储桶,并且该对象在集合中两次。java.util.HashSet
java.util.HashMap
java.util.HashMap
代码示例可能看起来有点人为,但我已经看到这种情况在域类中发生,其中哈希是从可变字段创建的,并且 equals 方法尚未与这些字段保持同步。