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