博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)...
阅读量:6516 次
发布时间:2019-06-24

本文共 2839 字,大约阅读时间需要 9 分钟。

这一章节我们讨论一个比較特殊的情况Key变了,能不能get出原来的value?

答案是:有时能够,有时不能够

1.能够的情况:

package com.ray.ch14;import java.util.HashMap;public class Test {	public static void main(String[] args) {		HashMap
map = new HashMap
(); Person person_1 = new Person(); person_1.setHeight(180); person_1.setId(1); person_1.setName("person_1"); Dog dog_1 = new Dog(); dog_1.setId(1); dog_1.setName("dog_1"); map.put(person_1, dog_1); person_1.setId(2); System.out.println(map.get(person_1)); }}class Dog { private int id = 0; private String name = ""; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}class Person { private int id = 0; private String name = ""; private int height = 0; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; }}
输出:

com.ray.ch14.Dog@1bc4459

上面的这样的情况我们不多说,由于都是常规的形式,以下我们具体来说一下不能够的情况。

2.不能够的情况:就是我们自己重写的hashCode,并且刚好hashCode方法里面跟某个属性关联(这样的是经常使用的方法。特别是关联对象的id)

package com.ray.ch14;import java.util.HashMap;public class Test {	public static void main(String[] args) {		HashMap
map = new HashMap
(); Person person_1 = new Person(); person_1.setHeight(180); person_1.setId(1); person_1.setName("person_1"); Dog dog_1 = new Dog(); dog_1.setId(1); dog_1.setName("dog_1"); map.put(person_1, dog_1); person_1.setId(2); System.out.println(map.get(person_1)); }}class Dog { private int id = 0; private String name = ""; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}class Person { private int id = 0; private String name = ""; private int height = 0; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } @Override public int hashCode() { System.out.println("hashCode() invoke,hashcode:" + id + name.hashCode() + height); return id + name.hashCode() + height; }}
输出:

hashCode() invoke,hashcode:1443164103180

hashCode() invoke,hashcode:2443164103180
null

解释:

(1)我们重写了原来的hashCode()方法,把他关联到全部属性

(2)我们在main方法里面修改了key,从而改变了key的hashCode。从输出能够看出,两次的key都不一样,第一次是我们put对象的时候的hashCode。第二次是我们过后get出来时候触犯的

(3)由于hashCode已经改变,因此jvm觉得能够已经改变了。即使map里面存储的value还是原来的那个,可是已经是取不出来的了

总结:这一章节我们通过一个比較特殊的样例,再次观察Map的工作原理。

这一章节就到这里,谢谢。

-----------------------------------

转载地址:http://ooofo.baihongyu.com/

你可能感兴趣的文章
考勤系统——代码分析
查看>>
Spring Cloud Hystrix java.lang.NoClassDefFoundError: org/aspectj/lang/JoinPoint 问题
查看>>
Go语言中通过结构体匿名字段实现方法的继承和重载
查看>>
select into 和 insert into select 两种表复制语句
查看>>
LOJ 117 有源汇有上下界最小流
查看>>
数组遍历——Vue.js
查看>>
linux提权辅助脚本(更新exp列表)
查看>>
IBATIS 写BLOB字段遇到的问题
查看>>
Java集合--Map
查看>>
Dev gridControl 按回车增加一行
查看>>
Reapte控件的使用
查看>>
模拟手指或者鼠标单击和双击
查看>>
生成器与迭代器
查看>>
方法(method)和函数(function)区别
查看>>
mysql数据库学习——3,表的创建,删除和变更
查看>>
express
查看>>
渐进式的脚本加载
查看>>
Python参数传递(传值&传引用)
查看>>
在windows上如何安装python web引擎jinja2
查看>>
移动短信网关模拟器
查看>>