java.util.Set 中的重复元素

2022-09-03 10:02:30

java.util.Set实现将删除重复的元素。

如何在 内部删除重复元素?java.util.Set


答案 1

实际上,来自源代码的AFAIK Java中的大多数实现甚至不检查该元素是否已经包含。Set

他们只是总是在保存集合元素的内部结构上执行,并让该对象处理重复情况。add()

例如: 调用内部,如果重复,则仅插入新对象并覆盖旧条目。HashSetput(K,V)HashMap


答案 2

稍微阅读一下你的问题,我猜你正在看到一个奇怪的行为(通常是每个人默认使用的)。java.util.HashSet

它的合约可以像这样在两次中得到相同的对象:java.util.Setjava.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.HashSetjava.util.HashMapjava.util.HashMap

代码示例可能看起来有点人为,但我已经看到这种情况在域类中发生,其中哈希是从可变字段创建的,并且 equals 方法尚未与这些字段保持同步。


推荐