hashCode

/**
* 覆盖equals时也要覆盖hashCode,如果不这样做的话就会违反Object.hashCode的通用约定
* 从而导致该类无法结合所有基于散列的集合一起正常工作,HashMap,HashSet,Hashtable.
* 约定内容
* 1.在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,
* hashCode方法都必须始终如一地返回同一个整数.在同一个应用程序的多次执行过程中,
* 每次执行所返回的整数可以不一致.
* 2.相等的对象必须具有相等的散列码
* 3.如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,
* 则不一定要产生不同的整数结果.但是给不相等的对象产生不同的整数结果,有可能提高散列表(hash table)的性能.
*/
final class PhoneNumber
{
private final short areaCode;
private final short prefix;
private final short lineNumber;

public PhoneNumber(int areaCode, int prefix, int lineNumber)
{
rangeCheck(areaCode, 999, "areaCode");
rangeCheck(prefix, 999, "prefix");
rangeCheck(lineNumber, 9999, "lineNumber");
this.areaCode = (short) areaCode;
this.prefix = (short) prefix;
this.lineNumber = (short) lineNumber;
}
private static void rangeCheck(int arg, int max, String name)
{
if (arg <0 || arg > max)
throw new IllegalArgumentException(name + ":" + arg);
}

@Override
public boolean equals(Object obj)
{
if (obj == this)
return true;
if (!(obj instanceof PhoneNumber))
return false;
PhoneNumber pn = (PhoneNumber) obj;
return pn.areaCode == areaCode && pn.lineNumber == lineNumber && pn.prefix == prefix;
}

/**
* 延迟初始化
*private volatile int hashCode;
* @Override
* public int hashCode()
* {
* int result = hashCode;
* if(result == 0)
* {
* result = 17;
* result = 31 * result + areaCode;
* result = 31 * result + prefix;
* result = 31 * result + lineNumber;
* hashCode = result;
* }
* return result;
* }
* @return
*/
@Override
public int hashCode()
{
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}
//这里涉及两个PhoneNumber实例:第一个被用于插入到HashMap中,第二个实例与第一个相等,被用于获取
// 由于PhoneNumber类没有覆盖hashCode方法,从而导致两个相等的实例具有不相等的散列码,违反了hashCode约定.
public static void main(String[] args)
{
Map<PhoneNumber, String> map = new HashMap<PhoneNumber, String>();
map.put(new PhoneNumber(101, 888, 1990),"Lebeau");
System.out.println(map.get(new PhoneNumber(101,888,1990)));
}
}

转载于:https://www.cnblogs.com/KAstandardization/p/10832886.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值