java - java HashSet 中的歧义

标签 java hashset

为什么我得到以下代码的输出 2 而不是 1? HashSet 不允许重复元素。

import java.util.*;

import java.io.*;

import java.math.*;

public class Main1

{

    static class pair 
    {
       int x;
       int y;
       public pair (int k, int p) 
       {
           x = k;
           y = p;
       }
    }
    public static void main(String[] args)throws IOException
    {
        Set<pair> hs=new HashSet<pair>();
        hs.add(new pair(1,2));
        hs.add(new pair(1,2));
        System.out.println(hs.size());
    }
}

最佳答案

您必须覆盖equalshashcode

来自Java的Set接口(interface)的文档:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element.

请注意,以下内容将打印 false:

    pair p1 = new pair(1, 2);
    pair p2 = new pair(1, 2);
    System.out.println(p1.equals(p2));

另请注意,java 约定是类名以大写字母开头。

这将为您完成工作:

    class Pair {

    int x;
    int y;

    public pair(int k, int p) {
        x = k;
        y = p;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        pair pair = (pair) o;
        return x == pair.x && y == pair.y;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
}

关于java - java HashSet 中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50785807/

相关文章:

java - 如何处理 Java 中的读取事务以提供一致性?

java - 老虎机使用方法

Java 哈希集和树集

java - 在java中返回多个map<string,string>

java - 从 Java 列表中收集唯一数据的最快方法

java - Java 中的 HashMap 无法散列 MyObject

java - Logback - 在启动时删除日志文件

java - 使用命令行提取 .jar 文件

java - 为什么 Java 8 中有像 DoubleFunction 这样的原始函数

c# - 为什么我要使用 HashSet 而不是 Dictionary?