套装的独特性

时间:2012-10-12 11:16:30

标签: java

如果我以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;
    }

}

在我的项目中,我有很多像这样的对象,但都是单独初始化的。我希望通过将所有内容添加到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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

如果您使用eclipse,则右键单击 - &gt;来源 - &gt;生成hashCode和Equals 。如果您想了解更多有关哈希码的知识,请等同于this portion中的Effective Java

答案 2 :(得分:1)

答案 3 :(得分:0)

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

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

(我认为文本不为空。如果它可能为null,则必须将其转换为acccoutn并使NPE无效)