比较java中的两个列表对象

时间:2014-09-11 14:24:54

标签: java list collections

我有以下简单的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,希望避免重复。但是它们都没有工作。帮我解决这个问题。

UserInfo中的

Hashcodeequals方法

@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;
} 

1 个答案:

答案 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