hashCode和equals方法的问题

在项目中为了区分对象有时候需要覆盖equals方法,此时也需要覆盖hashCode方法;这里题外强调一下,如果hashCode相同,那么equals方法未必一定会返回true,但是equals如果返回true,那么hashCode一定相同。

 

package com.test; 

import org.apache.commons.lang.builder.EqualsBuilder;

import org.apache.commons.lang.builder.HashCodeBuilder;

import org.apache.commons.lang.builder.ToStringBuilder;

public class Policy

{

    private String policyNo;

   

    private String subType;

   

    public Policy(String policyNo,String subType) {

       this.policyNo = policyNo;

       this.subType = subType;

    }

   

    public String getPolicyNo()

    {

       return policyNo;

    }

    public void setPolicyNo(String policyNo)

    {

       this.policyNo = policyNo;

    }

    public String getSubType()

    {

       return subType;

    }

    public void setSubType(String subType)

    {

       this.subType = subType;

    }

   

    @Override public boolean equals(Object obj)

    {

       if(!(obj instanceof Policy))

       {

           return false;

       }

      

       Policy castObj = (Policy)obj;

      

       return new EqualsBuilder().append(getSubType(), castObj.getSubType()).append(getPolicyNo(), castObj.getPolicyNo()).isEquals();

    }

   

    @Override public int hashCode()

    {

       return new HashCodeBuilder().append(getSubType()).append(getPolicyNo()).toHashCode();

    }

   

    @Override public String toString()

    {

       return new ToStringBuilder(this).append(getSubType()).append(getPolicyNo()).toString();

    }

}

 

 

 

       Set s = new HashSet();

       Policy p = new Policy("0","1");

       Policy p2 = new Policy("0","1");

       System.out.println(s.add(p) + p.toString());

       System.out.println(s.add(p2) + p2.toString());

       System.out.println(s.size());

 

truecom.test.Policy@1fb8ee3[1,0]

falsecom.test.Policy@10b30a7[1,0]

1

这里要用到commons-lang-2.0.jar

 

以下是自定义实现,但是不安全

 

    @Override

    public boolean equals(Object obj)

    {

       if(this == obj) {

           return true;

       }

       if(obj instanceof Policy) {

           Policy p = (Policy)obj;

           if(p.getSubType().equals(subType) && p.getPolicyNo().equals(policyNo)) {

              return true;

           }

       }

       return false;

    }

   

    @Override

    public int hashCode()

    {

       return policyNo.hashCode() + subType.hashCode();

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值