昆明java培训
达内昆明广州春城路

18487146383

热门课程

java程序员:覆盖equals时总要覆盖hashcode

  • 时间:2016-09-09
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训班的老师发现,覆盖equals时总要覆盖hashcode,下面就给大家上代码。

package cn.xf.cp.ch02.item9;

import java.util.HashMap;

import java.util.Map;

public 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, "area code");

rangeCheck(prefix, 999, "prefix");

rangeCheck(lineNumber, 9999, "line umber");

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 o)

{

if (o == this)

return true;

if (!(o instanceof PhoneNumber))

return false;

PhoneNumber pn = (PhoneNumber) o;

return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode;

}

/*

@Override

//至于为什么使用31,这个是推荐值,研究表明这个数字用起来性能比较好

public int hashCode()

{

int result = 17;

result = 31 * result + areaCode;

result = 31 * result + prefix;

result = 31 * result + lineNumber;

return result;

}

*/

//如果一个对象不是经常变动,而且开销比较大的话,就要考虑吧散列码缓存在对象内部

//用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。

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;

}

public static void main(String[] args)

{

Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>();

m.put(new PhoneNumber(707, 867, 5309), "Jenny");

//这里不会返回jenny哦,会返回null,这个是因为put对象吧他们放到不同的散列桶中

System.out.println(m.get(new PhoneNumber(707, 867, 5309)));

}

}

学Java开发就到昆明达内Java培训班!了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

上一篇:从零开始学Java - Spring AOP实现用户权限验证
下一篇:Java程序员的日常:基于类的策略模式

昆明Java培训班《Java分布式数据库的未来》

昆明java培训班:为什么java工程师薪资这么高?

昆明java培训班:你所不知道的java秘密

昆明java培训班;如何认识Java Web技术

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货