如何在HashSet中搜索对象?

时间:2017-06-16 01:22:51

标签: java class contains hashset

在我的Java程序中,类GraphPoint使用两个坐标 m n 来描述组合结构的点,这两个坐标是唯一的变量。我想创建一组无序的点:

Set<GraphPoint> collection = new HashSet<>();

现在我想知道collection是否包含给定坐标的点。什么是最快的编码方式?

1 个答案:

答案 0 :(得分:2)

如果GraphPoint类正确实现hashCodeequals,则使用contains方法:

collection.contains(new GraphPoint(m,n))

在返回true之前,JavaDoc for the HashSet contains() method将使用equals方法测试相等性。具体做法是:

  

如果此set包含指定的元素,则返回true。更正式地,当且仅当此集合包含元素e时才返回true(o == null?e == null:o.equals(e))。

为了完整起见,并假设您的GraphPoint类的行为与Point完全相同,您可以按如下方式实施hashCodeequals

@Override
public int hashCode() {
    int result = m;
    result = 31 * result + n;
    return result;
}

@Override
public boolean equals(Object other){
    if (this == other) return true;
    if (!(other instanceof GraphPoint)) return false;
    final GraphPoint that = (GraphPoint) other;
    return this.m == that.m && this.n == that.n;
}

推荐阅读:Effective Java: Equals and HashCode

另外,感谢@Federico_Peralta_Schaffner和@shmosel对我之前回答的反馈