3

如果我以 a 为例HashSet<E>,并向其中添加对象,它如何检查对象是否已经存在?

我有以下简单的设置:

private class MyObject {
    String text;

    public MyObject(String text) {
        this.text = text;
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof MyObject) {
            return ((MyObject) o).text.equals(text);
        }

        return false;
    }

}

在我的项目中,我有很多这样的对象,但都是单独初始化的。我想通过将 all 添加到 a 来过滤双打,Set如下所示:

MyObject m1 = new MyObject("1");
MyObject m2 = new MyObject("1");
MyObject m3 = new MyObject("2");

System.out.println(m1.equals(m2)); //expected: true, result: true
System.out.println(m1.equals(m3)); //expected: false, result: false

Set<MyObject> myObjects = new HashSet<MyObject>();
myObjects.add(m1);
myObjects.add(m2);
myObjects.add(m3);

System.out.println(myObjects.size()); //expected: 2, result: 3

Set<String> stringList = new HashSet<String>();
stringList.add("1");
stringList.add("1");
stringList.add("2");
System.out.println(stringList.size()); //expected: 2, result: 2

我怎样才能使我的myObjects套装不包含这些双打?所以m1m2是不同的实例,但具有相同的内容,所以我只需要m1.

编辑
基于 Mathias Schwarz 的回答,我实现了hashCode()如下功能:

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

但是,如果我有一个包含多个字段的更复杂的类,我将如何实现此方法?

4

4 回答 4

7

HashSet确定两个对象在调用结果equals和对象上是否相同hashCodehashCode如果你实施,你必须实施equals。如果它们不一致,HashSet将无法正确运行......所以重要的是这两种方法是如何实现的MyObject(顺便说一句,它实际上是一个类......)。

于 2012-10-12T11:19:26.510 回答
2

如果您使用 Eclipse,则右键单击 --> 源 --> 生成 hashCode 和 Equals。如果您想了解更多关于 hash code 和 equals的信息,请从Effective Java中阅读此部分

于 2012-10-12T12:07:03.707 回答
1

我同意马蒂亚斯·施瓦茨的观点。

更多信息:http ://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode () 和http://docs.oracle.com/javase/1.5。 0/docs/api/java/lang/Object.html#equals(java.lang.Object )

于 2012-10-12T11:22:57.267 回答
0

将以下内容添加到您的类 MyObject

public String hashCode() {
  return text.hashCode();
}

(我想该文本不为空。如果它可能为空,您必须将其纳入 acccoutn 并取消 NPE)

于 2012-10-12T11:21:40.390 回答