关于hashcode和equals方法重写的一些理解!

1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;

a: Map、Set等集合类型存放的对象必须是唯一的;

b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。

2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一。

2、我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。

在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样

  • 对于值对象,==比较的是两个对象的值
  • 对于引用对象,比较的是两个对象的地址

默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。

现在有一个学生对象,有属性学号跟姓名,现在我新建了一个学生对象,又从数据里查出一个学生对象,这两个对象的学号跟姓名都一样,那这两个对象是不是相等呢?一般情况下,除非你有特殊需求要处理,这两个对象是相等的,可如果用==去比较,返回的结果是错误的。

这时候我们就必须重写equlas方法了。如果学号是主键,在equals方法里,我们认为只要学号相同,就可以返回true。

hashCode方法也是可以用来比较两个对象是否相等的。但是我们很少使用,应该说是很少直接使用。hashCode方法返回的是一个int值,可以看做是一个对象的唯一编码,如果两个对象的hashCode值相同,我们应该认为这两个对象是同一个对象。

 

一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。

所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

--------------以上引用,下面引入自己在excel中去重复值的一个场景:

package com.touna.checkaccount.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * excel中查询出来的数据(重写equals和hashcode去重复)
 * 
 * @author tl
 */
public class LoanCount {

    /** 主键id */
    private int id;
    /** 序号 */
    private Integer sequence;
    /** 放款日期 */
    private Date confirmDate;
    /** 合同号 */
    private String contractNo;
    /** 借款人 */
    private String custName;
    /** 分公司号 */
    private String siteNo;
    /** 分公司 */
    private String siteName;
    /** 是否直销 */
    private int isDirect;
    /** 合作机构 */
    private String cooperation;
    /** 贷款类型 */
    private String loanType;
    /** 产品类型名字 */
    private String productTypeName;
    /** 产品类型 */
    private String productType;
    /** 还款方式 */
    private String paymentTypeName;
    /** 贷款总期数 */
    private int totalPhases;
    /** 客户主任 */
    private String customerDirector;
    /** 客户经理 */
    private String customerManager;
    /** 计息本金 */
    private double auditamt;
    /** 付款类型 */
    private String payType;
    /** 付款金额 */
    private double payAmt;
    /** 履约保证金 */
    private double lybzjFees;
    /** 考察费 */
    private double kcFeeS;
    /** gps费 */
    private double gpsFees;
    /** 抵押登记费 */
    private double dydjFees;
    /** 停车费 */
    private double tcFees;
    /** 盗抢险 */
    private double dqxFees;
    /** 刑侦费 */
    private double xzFees;
    /** 评估费 */
    private double pgFees;
    /** 律师见证费 */
    private double lsjzFees;
    /** 加急费 */
    private double jjFees;
    /** 风险金 */
    private double kdFees;
    /** 抵押登记 */
    private double gzFees;
    /** 手续费 */
    private double sxFees;
    /** 征信费 */
    private double zxsxFees;
    /** 快递费 */
    private double shouldglf;
    /** 其它 */
    private double qtFees;
    /** 报销状态 */
    private int reimbursementStatus;
    /** 审批状态 */
    private int approvalStatus;
    /** field 判断导入的属于哪个字段 */
    private String field;
    /** 处理时间 */
    private Date handleDate;
    /** 批次名 */
    private String batchName;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public Date getConfirmDate() {
        return confirmDate;
    }

    public void setConfirmDate(Date confirmDate) {
        this.confirmDate = confirmDate;
    }

    public String getContractNo() {
        return contractNo;
    }

    public void setContractNo(String contractNo) {
        this.contractNo = contractNo;
    }

    public String getSiteName() {
        return siteName;
    }

    public void setSiteName(String siteName) {
        this.siteName = siteName;
    }

    public int getIsDirect() {
        return isDirect;
    }

    public void setIsDirect(int isDirect) {
        this.isDirect = isDirect;
    }

    public String getCooperation() {
        return cooperation;
    }

    public void setCooperation(String cooperation) {
        this.cooperation = cooperation;
    }

    public String getLoanType() {
        return loanType;
    }

    public void setLoanType(String loanType) {
        this.loanType = loanType;
    }

    public String getProductTypeName() {
        return productTypeName;
    }

    public void setProductTypeName(String productTypeName) {
        this.productTypeName = productTypeName;
    }

    public String getProductType() {
        return productType;
    }

    public void setProductType(String productType) {
        this.productType = productType;
    }

    public String getPaymentTypeName() {
        return paymentTypeName;
    }

    public void setPaymentTypeName(String paymentTypeName) {
        this.paymentTypeName = paymentTypeName;
    }

    public int getTotalPhases() {
        return totalPhases;
    }

    public void setTotalPhases(int totalPhases) {
        this.totalPhases = totalPhases;
    }

    public String getCustomerDirector() {
        return customerDirector;
    }

    public void setCustomerDirector(String customerDirector) {
        this.customerDirector = customerDirector;
    }

    public String getCustomerManager() {
        return customerManager;
    }

    public void setCustomerManager(String customerManager) {
        this.customerManager = customerManager;
    }

    public double getAuditamt() {
        return auditamt;
    }

    public void setAuditamt(double auditamt) {
        this.auditamt = auditamt;
    }

    public String getPayType() {
        return payType;
    }

    public void setPayType(String payType) {
        this.payType = payType;
    }

    public double getPayAmt() {
        return payAmt;
    }

    public void setPayAmt(double payAmt) {
        this.payAmt = payAmt;
    }

    public double getLybzjFees() {
        return lybzjFees;
    }

    public void setLybzjFees(double lybzjFees) {
        this.lybzjFees = lybzjFees;
    }

    public double getKcFeeS() {
        return kcFeeS;
    }

    public void setKcFeeS(double kcFeeS) {
        this.kcFeeS = kcFeeS;
    }

    public double getGpsFees() {
        return gpsFees;
    }

    public void setGpsFees(double gpsFees) {
        this.gpsFees = gpsFees;
    }

    public double getDydjFees() {
        return dydjFees;
    }

    public void setDydjFees(double dydjFees) {
        this.dydjFees = dydjFees;
    }

    public double getTcFees() {
        return tcFees;
    }

    public void setTcFees(double tcFees) {
        this.tcFees = tcFees;
    }

    public double getDqxFees() {
        return dqxFees;
    }

    public void setDqxFees(double dqxFees) {
        this.dqxFees = dqxFees;
    }

    public double getXzFees() {
        return xzFees;
    }

    public void setXzFees(double xzFees) {
        this.xzFees = xzFees;
    }

    public double getPgFees() {
        return pgFees;
    }

    public void setPgFees(double pgFees) {
        this.pgFees = pgFees;
    }

    public double getLsjzFees() {
        return lsjzFees;
    }

    public void setLsjzFees(double lsjzFees) {
        this.lsjzFees = lsjzFees;
    }

    public double getJjFees() {
        return jjFees;
    }

    public void setJjFees(double jjFees) {
        this.jjFees = jjFees;
    }

    public double getKdFees() {
        return kdFees;
    }

    public void setKdFees(double kdFees) {
        this.kdFees = kdFees;
    }

    public double getGzFees() {
        return gzFees;
    }

    public void setGzFees(double gzFees) {
        this.gzFees = gzFees;
    }

    public double getSxFees() {
        return sxFees;
    }

    public void setSxFees(double sxFees) {
        this.sxFees = sxFees;
    }

    public double getZxsxFees() {
        return zxsxFees;
    }

    public void setZxsxFees(double zxsxFees) {
        this.zxsxFees = zxsxFees;
    }

    public double getShouldglf() {
        return shouldglf;
    }

    public void setShouldglf(double shouldglf) {
        this.shouldglf = shouldglf;
    }

    public double getQtFees() {
        return qtFees;
    }

    public void setQtFees(double qtFees) {
        this.qtFees = qtFees;
    }

    public int getReimbursementStatus() {
        return reimbursementStatus;
    }

    public void setReimbursementStatus(int reimbursementStatus) {
        this.reimbursementStatus = reimbursementStatus;
    }

    public int getApprovalStatus() {
        return approvalStatus;
    }

    public String getSiteNo() {
        return siteNo;
    }

    public void setSiteNo(String siteNo) {
        this.siteNo = siteNo;
    }

    public void setApprovalStatus(int approvalStatus) {
        this.approvalStatus = approvalStatus;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public Integer getSequence() {
        return sequence;
    }

    public void setSequence(Integer sequence) {
        this.sequence = sequence;
    }

    public Date getHandleDate() {
        return handleDate;
    }

    public void setHandleDate(Date handleDate) {
        this.handleDate = handleDate;
    }

    public String getBatchName() {
        return batchName;
    }

    public void setBatchName(String batchName) {
        this.batchName = batchName;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (this == obj)
            return true;
        if (!(obj instanceof LoanCount))
            return false;
        LoanCount lr = (LoanCount) obj;
        // 如果合同号相同且对应金额都不为空(>0),则认为重复
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && kcFeeS > 0 && lr.getKcFeeS() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && gpsFees > 0 && lr.getGpsFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && dydjFees > 0 && lr.getDydjFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && dqxFees > 0 && lr.getDqxFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && xzFees > 0 && lr.getXzFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && pgFees > 0 && lr.getPgFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && lsjzFees > 0 && lr.getLsjzFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && jjFees > 0 && lr.getJjFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && kdFees > 0 && lr.getKdFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && gzFees > 0 && lr.getGzFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && sxFees > 0 && lr.getSxFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && zxsxFees > 0 && lr.getZxsxFees() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && shouldglf > 0 && lr.getShouldglf() > 0) {
            return true;
        }
        if (lr.getContractNo() != null && lr.getContractNo().equals(contractNo) && qtFees > 0 && lr.getQtFees() > 0) {
            return true;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return contractNo.hashCode() + 123 * 100;
    }

    public static void main(String[] args) {
        LoanCount l1 = new LoanCount();
        l1.setContractNo("FSRXJK-20150130407");
        l1.setKcFeeS(90.0);

        LoanCount l2 = new LoanCount();
        l2.setContractNo("FSRXJK-20150130407");
        l2.setKcFeeS(1100.0);
        l2.setDqxFees(100);

        List<LoanCount> loanCounts = new ArrayList<LoanCount>();
        loanCounts.add(l1);
        loanCounts.add(l2);
        
        System.out.println(getSameValues(loanCounts).size());
        
    }
    
    /**
     * 获取list中相同元素
     * @param loanCounts
     * @return
     */
    private static List<LoanCount> getSameValues(List<LoanCount> loanCounts){
        if(loanCounts == null || loanCounts.size() == 0) {
            return null;
        } else {
          List<LoanCount> sames = new ArrayList<LoanCount>();
          List<LoanCount> unsames = new ArrayList<LoanCount>();
          for(LoanCount l : loanCounts) {
              if(unsames.contains(l)) {
                  sames.add(l);
              } else {
                  unsames.add(l);
              }
          }
          return sames;
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hashCodeequals是Java中Object类的两个方法。它们的重写是为了在自定义类中实现对象的比较和哈希码生成。 hashCode方法用于生成对象的哈希码,哈希码是一个整数,用于快速比较对象是否相等。在重写hashCode方法时,需要保证相等的对象生成相同的哈希码,不相等的对象生成不同的哈希码。 equals方法用于比较两个对象是否相等。在重写equals方法时,需要保证相等的对象返回true,不相等的对象返回false。通常需要重写hashCode方法和equals方法一起使用,以确保对象的正确比较和哈希码生成。 ### 回答2: hashcodeequals是Java中Object类中的两个重要方法。在需要比较对象相等性和进行哈希表存储的场景中,我们常常需要重写这两个方法。 hashcode方法返回对象的哈希码,用于确定对象在哈希表中的位置。哈希码是根据对象的内部信息计算出来的整型数值。具有相等的对象必须具有相等的哈希码,但相等的哈希码不一定代表对象相等。在重写hashcode方法时,一般应该按照对象中的所有重要属性,如字符串、数值等进行哈希码的计算,保持一致性。同时,我们也需要遵循一些规则,如相等的对象必须具有相等的哈希码,避免哈希冲突。 equals方法用于比较对象的相等性。equals方法被定义为Object类的一个方法,其默认行为是比较对象的引用。因此,在我们自定义的类中,如果需要比较对象的内容,就需要重写equals方法。我们重写equals方法时,一般应该比较对象中的所有重要属性是否相等。并且,还需要保证equals方法满足一些规则,如自反性、对称性、传递性和一致性等。 在重写hashcodeequals方法时,需要保证hashcodeequals方法的一致性,即如果两个对象相等,则它们的哈希码也必须相等。这样可以保证相等的对象在哈希表中的位置一致。 总而言之,重写hashcodeequals方法是为了在需要比较对象相等性和进行哈希表存储的场景中能够正确判断对象的相等性。这两个方法的逻辑需要按照对象自身的特性进行实现,以确保正确性和一致性。 ### 回答3: hashCodeequals是Java中Object类中的两个方法。在开发中,有时需要重写这两个方法来实现自定义的对象比较和哈希值计算。 hashCode方法用于计算对象的哈希值,它返回一个对象的整型数值,用于在哈希表等数据结构中快速定位对象。Java中的哈希值计算方法是将对象的内存地址经过某种算法转换为整数。如果我们自定义的对象需要用于集合类(如HashSet、HashMap)等需要快速查找和比较的场合,就需要重写hashCode方法。在重写时,我们可以以对象的属性作为计算哈希值的依据,确保相等的对象具有相等的哈希值。 equals方法用于比较两个对象是否相等,默认情况下,equals比较的是对象的内存地址。但在实际开发中,我们可能需要定义两个对象相等的标准,比如两个用户对象的用户名相同即可认为相等。此时,我们就需要重写equals方法,根据自定义的标准来比较对象的属性。在重写时,必须满足以下几个条件: 1. 自反性:对于任意非空引用x,x.equals(x)必须返回true。 2. 对称性:对于任意非空引用x和y,如果x.equals(y)返回true,那么y.equals(x)也必须返回true。 3. 传递性:对于任意非空引用x、y和z,如果x.equals(y)返回true,y.equals(z)也返回true,那么x.equals(z)也必须返回true。 4. 一致性:对于任意非空引用x和y,如果x和y的属性没有发生变化,多次调用x.equals(y)应该返回相同的结果。 5. 对于任意非空引用x,x.equals(null)必须返回false。 hashCodeequals的重写是为了让我们能够根据我们自定义的规则来比较和存储对象,并且保证在集合类中能够正常使用。使用IDE自动生成hashCodeequals方法可以确保满足上述的条件,减少了出错的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值