java HashSet中的歧义

时间:2018-06-10 16:31:35

标签: java hashset

为什么我为以下代码而不是1获取输出2? 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());
    }
}

1 个答案:

答案 0 :(得分:2)

您必须覆盖equalshashcode

来自Java Set接口的文档:

  

不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。

请注意,以下内容将打印为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);
    }
}