Java哈希集包含对象

Java哈希集包含对象,java,object,equals,contains,hashset,Java,Object,Equals,Contains,Hashset,我用重写的equals方法创建了自己的类,该方法只检查名称(类中的属性)是否相等。现在,我将该类的一些实例存储在哈希集中,这样哈希集中就不会有同名的实例 我的问题:如何检查HashSet是否包含这样的对象。contains()在这种情况下不起作用,因为它与.equals()方法一起工作。我想检查它是否真的是同一个物体 编辑: 封装测试程序; 导入java.util.HashSet; 导入java.util.Set; 公开课范例{ 私有静态最终集=新HashSet(); 私有最终字符串名; 私人i

我用重写的equals方法创建了自己的类,该方法只检查名称(类中的属性)是否相等。现在,我将该类的一些实例存储在哈希集中,这样哈希集中就不会有同名的实例

我的问题:如何检查HashSet是否包含这样的对象。contains()在这种情况下不起作用,因为它与.equals()方法一起工作。我想检查它是否真的是同一个物体

编辑:

封装测试程序;
导入java.util.HashSet;
导入java.util.Set;
公开课范例{
私有静态最终集=新HashSet();
私有最终字符串名;
私人int示例;
公共示例(字符串名称,int示例){
this.name=名称;
这个例子=例子;
设置。添加(此);
}
公共布尔值isThisInList(){
返回集。包含(此);
//如果该值正好等于列表中的任何实例,则将返回true
//但它不应该这样做
//如果对象确实在列表中,则应返回true
}
公共布尔删除(){
返回集。移除(此);
}
//重写equals和hashCode
}

对不起,我的英语不是很好。如果您不明白我的意思,请随时再次询问。

您还必须重写hashCode方法。

HashSet
contains
使用equals方法确定对象是否包含,并且重复项不保留在HashSet中

假设您的
等于
hashcode
仅使用
名称
字段

HashSet<MyObject> objectSet = new HashSet<MyObject>();
MyObject name1Object = new MyObject("name1");

objectSet.add(new MyObject("name1"));
objectSet.add(name1Object);
objectSet.add(new MyObject("name2"));
//HashSet now contains 2 objects, name1Object and the new name2 object
//HashSets do not hold duplicate objects (name1Object and the new object with name1 would be considered duplicates)

objectSet.contains(new MyObject("name1")) // returns true
objectSet.contains(name1Object)           // returns true
objectSet.contains(new MyObject("name2")) // returns true
objectSet.contains(new MyObject("name3")) // returns false
如果您对特定对象执行很多操作,那么使用
HashMap
可能会更容易,这样您就不必遍历列表来获取特定的命名对象。可能值得为您调查,因为这样您就可以执行以下操作:

(objectMap.get("name") == myNameObject) // with a HashMap<String, MyNameObject> where "name" is the key string.
(objectMap.get(“name”)==myNameObject)//使用HashMap,其中“name”是键字符串。

在您的情况下,判断HashSet中是否包含对象的特定实例的唯一方法是迭代HashSet的内容,并比较对象标识(使用==运算符而不是equals()方法)

比如:

boolean isObjectInSet(Object object, Set<? extends Object> set) {
   boolean result = false;

   for(Object o : set) {
     if(o == object) {
       result = true;
       break;
     }
   }

   return result;
}

boolean isobjectnset(Object-Object,Set检查对象是否为同一对象的方法是将它们与==进行比较,以查看对象引用是否相等

亲切的问候,, 弗兰克试试这个。。 只考虑对象的一个属性“名称”,以保持唯一性

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (name == null ? 0 : name.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;
    }
    User other = (User) obj;
    if (name == null) {
        if (other.name != null) {
            return false;
        }
    } else if (!name.equals(other.name)) {
        return false;
    }
    return true;
}
我用重写的equals方法创建了自己的类,该方法只检查名称(类中的属性)是否相等

这违反了合同,无论看起来多么方便,你都不能这样做

相反,如果要按某个属性(如名称)对元素进行索引和查找,请使用
HashMap
查找元素。或者,使用并传递仅比较名称的方法。然后可以删除不正确的
equals
方法

如果要通过引用相等查找对象,有三种方法:

  • 您的对象没有固有的或有用的平等概念

    不要实现
    equals
    。将其保留为默认值。然后,您可以使用
    HashSet
    查找引用相等,并使用HashMap或TreeSet按任何特定属性对其进行索引

  • 您的对象确实有一个有用的、通用的相等概念,但是您希望高效地找到等效实例

    这种情况几乎从未发生过。但是,您可以使用例如Apache

  • 你不在乎效率

    使用for循环和
    =
    每个元素


  • 重写
    equals()
    时必须重写
    hashCode()
    。我知道,但这不是我的问题。这听起来更像是一个糟糕的设计,需要解决,而不是一个特定的实现。因此,这两个方法都有重写,但仍然不起作用。你说“这样的对象”是什么意思?您是否有您正在寻找的实际对象?@stonar96那么您的问题不清楚。请更新它,以包括覆盖了
    hashCode
    的事实。但是在这种情况下
    包含的
    应该可以找到您的对象。还请包括任何相关的代码和数据,以便我们可以重现您的问题。我还有另一个参考资料,我想看看它是否还在名单上。你知道我的意思吗?谢谢,你的答案就是我问题的答案。
    boolean isObjectInSet(Object object, Set<? extends Object> set) {
       boolean result = false;
    
       for(Object o : set) {
         if(o == object) {
           result = true;
           break;
         }
       }
    
       return result;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (name == null ? 0 : name.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;
        }
        User other = (User) obj;
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        return true;
    }