具有唯一键字符串的用户定义类型的Java集合集

时间:2018-11-15 03:18:18

标签: java hash set

我想知道是否有一个集合可以用于武器类,就像武器对象的hash_set一样,但是我想在我的武器类中使用一个名称字段,并使其不具有相同的两个武器名称可以存在于集合中。我想将输入与我的武器组的字符串进行比较,以查看是否已经存在,如果不存在,则不要将其放入组中,但是我不想每次都搜索整个地图。另外,它也不区分大小写。

2 个答案:

答案 0 :(得分:3)

在您的equals()中,仅检查name字段是否相等。

public class Weapon {

    private String name;
    // ... other fields

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Weapon weapon = (Weapon) o;

        return name.equalsIgnoreCase(weapon.name); //case-insensitive
    }

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

然后像这样使用HashSet:-

public static void main(String[] args) {
    Set<Weapon> weapons = new HashSet<>();
    Weapon w1 = new Weapon();
    // TODO set the name of the weapon or pass it in constructor
    if (weapons.add(w1)) {
        System.out.println("Weapon added");
    } else {
        System.out.println("Weapon with same name already exists");
    }
}

答案 1 :(得分:1)

我们必须重写equals()和hashcode()方法以返回相同的整数名称。

下面是equals()和hashcode()合约:

请参阅java.lang.Object的JavaDoc

在hashCode()中表示:

如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。

如果仅覆盖equals()而不是hashCode(),则您的类违反了此合同。

equals()方法的JavaDoc中也提到了这一点:

请注意,通常每当重写此方法时,都必须重写hashCode方法,以维护hashCode方法的常规协定,该协定规定相等的对象必须具有相等的哈希码。