课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java程序员:覆盖equals时总要覆盖hashcode
  • java程序员:覆盖equals时总要覆盖hashcode

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

  • 昆明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--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56