java - 如何在 Set 中添加重复元素?

标签 java

我想在集合中添加重复元素,我该怎么做?我必须覆盖哪些方法。

    public final class AddDupliacateElementInSet
    {
         public static void main(String[] args)
         {
             Set<Integer> set =new HashSet<>();
             set.add(1);
             set.add(1);
             set.add(3);
             set.add(4);
             set.add(5);
             set.add(6);
             set.forEach(s->System.out.println(s));  
         }
    }

最佳答案

正如社区在评论中指出的那样,Set 并不意味着存储重复值。但是出于“面试问题”或“您无法更改的库代码”等原因,您可以通过覆盖 equals 以始终返回 false 来强制它存储重复项。

对于原始类型或其他不受您控制的对象,您可以围绕您的值对象创建一个包装类,并使其 equals() 始终返回 false:

public class UnequalWrapper {

    private int value;

    //...constructor, getter, setter

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(value);
    }
}

然后使用它:

public static void main(String[] args) {
    UnequalWrapper a = new UnequalWrapper(1);
    UnequalWrapper b = new UnequalWrapper(2);
    UnequalWrapper c = new UnequalWrapper(1);

    Set<UnequalWrapper> set = Set.of(a, b, c);
    set.forEach(wrapper -> System.out.println(wrapper.getValue()));
}

输出:

1
2
1

但同样,不推荐,不要在家里尝试!

编辑:
如果您使用包装器,则可以省略 equals()hashcode()。这是因为 Object 类的方法将检查对象引用,如果您每次都创建一个新的包装器实例,这将有所不同。

关于java - 如何在 Set 中添加重复元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660570/

相关文章:

java - 在Application.java中按名称返回结果 View

java - 在 eclipse、cmd 和 jar 中运行时的工作目录

java - Netbeans 混淆

java - Android java测试 float 负值和正值无法正常工作?

java - 如何通过远程服务器上的 shell 一次在 Tomcat 上部署多个 war 文件?

java - 检测是否启用了开发人员选项的万无一失的方法?

c# - 相当于c#中的AbstractTableModel

java - 防止 HttpServletResponse OutputStream 在获取/发布/服务后关闭 (Polarion)

java - 如何从java中的json对象读取小数?

java - Eclipse 自动完成功能类似于 Netbeans