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

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

1.能够的情况:

  1. package com.ray.ch14;
  2.  
  3. import java.util.HashMap;
  4.  
  5. public class Test {
  6. public static void main(String[] args) {
  7. HashMap<Person, Dog> map = new HashMap<Person, Dog>();
  8. Person person_1 = new Person();
  9. person_1.setHeight(180);
  10. person_1.setId(1);
  11. person_1.setName("person_1");
  12. Dog dog_1 = new Dog();
  13. dog_1.setId(1);
  14. dog_1.setName("dog_1");
  15. map.put(person_1, dog_1);
  16. person_1.setId(2);
  17. System.out.println(map.get(person_1));
  18. }
  19. }
  20.  
  21. class Dog {
  22. private int id = 0;
  23. private String name = "";
  24.  
  25. public int getId() {
  26. return id;
  27. }
  28.  
  29. public void setId(int id) {
  30. this.id = id;
  31. }
  32.  
  33. public String getName() {
  34. return name;
  35. }
  36.  
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40.  
  41. }
  42.  
  43. class Person {
  44. private int id = 0;
  45. private String name = "";
  46. private int height = 0;
  47.  
  48. public int getId() {
  49. return id;
  50. }
  51.  
  52. public void setId(int id) {
  53. this.id = id;
  54. }
  55.  
  56. public String getName() {
  57. return name;
  58. }
  59.  
  60. public void setName(String name) {
  61. this.name = name;
  62. }
  63.  
  64. public int getHeight() {
  65. return height;
  66. }
  67.  
  68. public void setHeight(int height) {
  69. this.height = height;
  70. }
  71. }

输出:

com.ray.ch14.Dog@1bc4459

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

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

  1. package com.ray.ch14;
  2.  
  3. import java.util.HashMap;
  4.  
  5. public class Test {
  6. public static void main(String[] args) {
  7. HashMap<Person, Dog> map = new HashMap<Person, Dog>();
  8. Person person_1 = new Person();
  9. person_1.setHeight(180);
  10. person_1.setId(1);
  11. person_1.setName("person_1");
  12. Dog dog_1 = new Dog();
  13. dog_1.setId(1);
  14. dog_1.setName("dog_1");
  15. map.put(person_1, dog_1);
  16. person_1.setId(2);
  17. System.out.println(map.get(person_1));
  18. }
  19. }
  20.  
  21. class Dog {
  22. private int id = 0;
  23. private String name = "";
  24.  
  25. public int getId() {
  26. return id;
  27. }
  28.  
  29. public void setId(int id) {
  30. this.id = id;
  31. }
  32.  
  33. public String getName() {
  34. return name;
  35. }
  36.  
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40.  
  41. }
  42.  
  43. class Person {
  44. private int id = 0;
  45. private String name = "";
  46. private int height = 0;
  47.  
  48. public int getId() {
  49. return id;
  50. }
  51.  
  52. public void setId(int id) {
  53. this.id = id;
  54. }
  55.  
  56. public String getName() {
  57. return name;
  58. }
  59.  
  60. public void setName(String name) {
  61. this.name = name;
  62. }
  63.  
  64. public int getHeight() {
  65. return height;
  66. }
  67.  
  68. public void setHeight(int height) {
  69. this.height = height;
  70. }
  71.  
  72. @Override
  73. public int hashCode() {
  74. System.out.println("hashCode() invoke,hashcode:" + id + name.hashCode()
  75. + height);
  76. return id + name.hashCode() + height;
  77. }
  78. }

输出:

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的工作原理。

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

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

文件夹

从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)的更多相关文章

  1. 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能

    这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理. 1.什么是装载因子?他有什么作用? 以下的代码就是装载因子 /** * The load factor used when no ...

  2. 从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(常常作为面试题)

    这一章节我们来讨论一下hash碰撞. 1.什么是hash碰撞? 就是两个对象的key的hashcode是一样的,这个时候怎么get他的value呢? 答案是通过equals遍历table那个位置上面的 ...

  3. 从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法

    接着上一章节.我们来讨论一下get方法. 1.还是利用上一章节的图 下图引用自:http://www.admin10000.com/document/3322.html 我们简单说一下步骤.就是通过h ...

  4. 【转】Java学习---HashMap的工作原理

    [原文]https://www.toutiao.com/i6592560649652404744/ HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都 ...

  5. Java中的数据结构有哪些?HashMap的工作原理是什么?

    Java中常用数据结构 常用的数据结构有哈希表,线性表,链表,java.util包中有三个重要的接口:List,Set,Map常用来实现基本的数据结构 HashMap的工作原理 HashMap基于ha ...

  6. Java中的HashMap的工作原理是什么?

    问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...

  7. Java HashMap的工作原理(转载)

    原文地址:http://www.importnew.com/10620.html 面试的时候经常会遇见诸如:"java中的HashMap是怎么工作的","HashMap的 ...

  8. [Java] SSH框架笔记_SSH三大框架的工作原理及流程

    Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...

  9. Java HashMap的工作原理

    面试的时候经常会遇见诸如:”java中的HashMap是怎么工作的”.”HashMap的get和put内部的工作原理”这样的问题. 本文将用一个简单的例子来解释下HashMap内部的工作原理. 首先我 ...

随机推荐

  1. JAVA的驼峰和下划线互转帮助类

    实体类: import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Data; import lombo ...

  2. ubuntu sublime 破解

    1.去其官方网站http://www.sublimetext.com/ 把linux版下载下来,解开压缩包,放在你希望的路径下. 2.用vim将其打开 . vim sublime_text 3.将文件 ...

  3. jQuery对象复制

    // 浅层复制(只复制顶层的非 object 元素) var newObject = jQuery.extend({}, oldObject); // 深层复制(一层一层往下复制直到最底层) var ...

  4. numpy二分查找

    a = np.array([1, 2, 2, 3]) print(np.searchsorted(a, 0)) # 0 print(np.searchsorted(a, 1)) # 0 print(n ...

  5. Rot13加密算法

    Rot13是一种非常简单的替换加密算法,只能加密26个英语字母.方法是:把每个字母用其后第13个字母代替. 因为有26个字母,取其一半13. s = "xrlvf23xfqwsxsqf&qu ...

  6. maven常见问题问答(转)

    转自:http://www.oschina.net/question/158170_29368 1.前言 Maven,发音是[`meivin],"专家"的 意思.它是一个很好的项目 ...

  7. [转]解决Eclipse中编辑xml文件的智能提示问题

    转自:http://hi.baidu.com/cghroom/item/48fd2d0dc1fc23c675cd3c3e 摘要:  Eclipse for Android xml 文件代码自动提示功能 ...

  8. iOS 10 之 网络权限带来的坑

    症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...

  9. log4j(六)——log4j.properties简单配置样例说明

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...

  10. Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串

    Jquery 选择器 详解   在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...