从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
来源:互联网 发布:广西网络创业培训补贴 编辑:程序博客网 时间:2024/05/22 03:22
这一章节我们讨论一个比较特殊的情况Key变了,能不能get出原来的value?
答案是:有时可以,有时不可以
1.可以的情况:
package com.ray.ch14;import java.util.HashMap;public class Test {public static void main(String[] args) {HashMap<Person, Dog> map = new HashMap<Person, Dog>();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<Person, Dog> map = new HashMap<Person, Dog>();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;}@Overridepublic 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的工作原理。
这一章节就到这里,谢谢。
-----------------------------------
目录
0 0
- 从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
- 从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(经常作为面试题)
- 从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法
- 从头认识java-15.7 Map(2)-介绍HashMap的工作原理-put方法
- 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能
- Map 的一点分析:在java.util.Map加入了一样的key,则这个key值的value会覆盖掉原来的value
- 从头认识java-15.7 Map(1)-使用数组来简单模拟Map的创建
- 【Java面试题】HashMap中插入null key的过程
- HashMap工作原理以及与HashTable的区别--面试题
- JAVA HashMap 的工作原理(译)
- HashMap和HashTable,HashMap中key和value的原理
- HashMap和HashTable,HashMap中key和value的原理
- HashMap和HashTable,HashMap中key和value的原理
- 一些Android的面试题及答案(偶尔更新)
- Java 自定义类作为HashMap的key
- Java HashMap中put与get的工作原理
- Java Map遍历方式的选——TreeMap、HashMap的key、value遍历
- 从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap
- 云计算与虚拟化概述
- react-native 保存图片到本地
- 代码检测vc2013环境是否已经安装了
- 关于开源框架SuperRecyclerView瀑布流卡顿问题
- java设计模式
- 从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
- Python的队列
- Shodan完全手册部分翻译(3)
- Eclipse启动报错
- 谁在哪一排(C语言实现)
- WA的2015与正在RE的2016
- PHP分页原理及代码(新手学习)
- JDK动态代理实现原理
- 安装IBM DB2 for LUW时的安装需求