比较集合中的对象

时间:2016-10-18 19:31:02

标签: java hash set

现在我有这个Java代码

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class Dummy {

    private String value;

    public Dummy(final String value) {
        this.value = value;
    }

    public boolean equals(final Object that) {
        return that instanceof Dummy && Objects.equals(value, ((Dummy) that).value);
    }

    public int hashcode() {
        return Objects.hash(value);
    }

    public static void main(final String... args) {
        final Set<Dummy> dummies = new HashSet<>();
        dummies.add(new Dummy("toto"));
        System.out.println(dummies.contains(new Dummy("toto")));
    }
}

输出是“假”,我应该通过只更改一个字符将其更改为“true”,但我完全不知道如何做到这一点......任何想法?谢谢。 :)

3 个答案:

答案 0 :(得分:5)

hashcode()不是Object的方法,但hashCode()是。

 public int hashcode() {
         return Objects.hash(value);
   }

应该是

public int hashCode() {
        return Objects.hash(value);
    }

答案 1 :(得分:1)

在我的情况下,我有很多对象都需要一个equals和hash方法。我使用lombok来减少工作和代码。

@Data
@AllArgsConstructor
@EqualsAndHashCode
public class JsonPictureStuff {
    private String type;
    private String url;
    private String width;
    private String height;
}

注释指示lombok为您添加代码。

答案 2 :(得分:0)

你的集合无效,因为你以不正确的方式实现了equals和hashcode ......

  1. 特别是因为你甚至没有考虑字符串字段
  2. 您正在避免使用注释覆盖,这会提示您错误命名的方法,例如哈希码哈希码
  3. 你可以做点什么

       @Override
        public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((value == null) ? 0 : value.hashCode());
        return result;
        }
    
        @Override
        public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Dummy  other = (Dummy ) obj;
        if (value == null) {
            if (other.value != null)
            return false;
        } else if (!value.equals(other.value))
            return false;
        return true;
        }
    
    在像eclipse这样的ide中你可以右击并自动生成这些方法,这样你就可以保存实现