从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
2016-01-02 23:12
621 查看
这一章节我们讨论一个比较特殊的情况Key变了,能不能get出原来的value?
答案是:有时可以,有时不可以
1.可以的情况:
输出:
com.ray.ch14.Dog@1bc4459
上面的这种情况我们不多说,因为都是常规的形式,下面我们详细来说一下不可以的情况。
2.不可以的情况:就是我们自己重写的hashCode,而且刚好hashCode方法里面跟某个属性关联(这种是常用的方法,特别是关联对象的id)
输出:
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的工作原理。
这一章节就到这里,谢谢。
-----------------------------------
目录
答案是:有时可以,有时不可以
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; } @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的工作原理。
这一章节就到这里,谢谢。
-----------------------------------
目录
相关文章推荐
- LeetCode307. Range Sum Query - Mutable二叉索引树实战
- UIImageView的使用
- UVA-11572 Unique Snowflakes(滑动窗口)
- Android studio introduction No.2 -- basic setting and build a helloword project
- UILabel使用
- 计算器 UITextField
- Stop Hardcoding- Follow Parameterization Technique
- IOS UI基础控件总结
- Android requires compiler compliance level 5.0 or 6.0. Found '
- 给UITextView添加链接
- 使用druid连接池的超时回收机制排查连接泄露问题
- Burp Suite抓包、截包和改包
- UIWindow的一些基本概念和注意点
- Starting MySQL...... ERROR! Manager of pid-file quit without updating file.
- UIPageControl
- UIScrollView
- UIView动画
- 182. Duplicate Emails My Submissions Question
- iOS UIPickerView的使用
- UISlider 滑竿控件