Java 覆盖equals时总要覆盖hashcode

网友投稿 195 2023-06-26


Java 覆盖equals时总要覆盖hashcode

java 覆盖equals时总要覆盖hashcode

最近学习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 number");

this.areaCode = (short) areaCode;

this.prefix = (short) prefix;

ZhmJh 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 * resuZhmJhlt + 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 m = new HashMap();

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

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

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

}

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:简单理解Vue条件渲染
下一篇:利用浮层使select不可选的实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~