我有以下简单的java程序来比较列表中的两个对象。
public static void main( String[] args )
{
UserInfo user=new UserInfo();
user.setDomainId(2);
user.setId("sxpadmin");
user.setStatus("active");
UserInfo user1=new UserInfo();
user1.setDomainId(2);
user1.setId("sxpadmin");
user1.setStatus("active");
System.out.println(user.equals(user1));
List<UserInfo> userinfo=new ArrayList<UserInfo>();
userinfo.add(user);
userinfo.add(user1);
HashSet<UserInfo> set = new HashSet<UserInfo>();
for (UserInfo temp : userinfo)
{
if(set.contains(temp)){
System.out.println("same");
}
else{
System.out.println("different");
set.add(temp);
}
}
}
现在我正在比较这两个对象,它应该采用if block,因为两个对象中的内容是相同的。
我正在迭代userinfo
对象并组合其元素,我也将其添加到set
,希望避免重复。但是它们都没有工作。帮我解决这个问题。
Hashcode
和equals
方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + customer_id;
result = prime * result
+ ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result
+ ((last_name == null) ? 0 : last_name.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result
+ ((first_name == null) ? 0 : first_name.hashCode());
// Added by Sandip on 04 Jan 2013 for 2 FA
result = prime * result
+ ((seed_value == null) ? 0 : seed_value.hashCode());
// End added by Sandip on 04 Jan 2013 for 2 FA
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserInfo other = (UserInfo) obj;
if (customer_id != other.customer_id)
return false;
if (last_name == null) {
if (other.last_name != null)
return false;
} else if (!last_name.equals(other.last_name))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (first_name == null) {
if (other.first_name != null)
return false;
} else if (!first_name.equals(other.first_name))
return false;
// Added by Sandip on 04 Jan 2013 for 2 FA
if (seed_value == null) {
if (other.seed_value != null)
return false;
} else if (!seed_value.equals(other.seed_value))
return false;
// End added by Sandip on 04 Jan 2013 for 2 FA
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
return true;
}
答案 0 :(得分:0)
如果你想在这里创建工作解决方案,你必须覆盖equals和hashCode方法。 许多IDE都具有为所选类自动生成这些方法的功能。以下UserInfo代码显示了IntelliJ生成的方法:
public class UserInfo {
private int domainId;
private String id;
private String status;
public void setDomainId(int domainId) {
this.domainId = domainId;
}
public void setId(String id) {
this.id = id;
}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserInfo userInfo = (UserInfo) o;
if (domainId != userInfo.domainId) return false;
if (id != null ? !id.equals(userInfo.id) : userInfo.id != null) return false;
if (status != null ? !status.equals(userInfo.status) : userInfo.status != null) return false;
return true;
}
@Override
public int hashCode() {
int result = domainId;
result = 31 * result + (id != null ? id.hashCode() : 0);
result = 31 * result + (status != null ? status.hashCode() : 0);
return result;
}
}
重要的是要记住,如果某个类没有实现这些方法,那么hashCode会在内存中返回对象地址的哈希值,而equals正在使用这个默认版本的hashCode。
上面粘贴的代码正在处理您粘贴的代码。我的输出是:
true
different
same