从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
这一章节我们讨论一个比較特殊的情况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;
}
@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的工作原理。
这一章节就到这里,谢谢。
-----------------------------------
从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)的更多相关文章
- 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能
这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理. 1.什么是装载因子?他有什么作用? 以下的代码就是装载因子 /** * The load factor used when no ...
- 从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(常常作为面试题)
这一章节我们来讨论一下hash碰撞. 1.什么是hash碰撞? 就是两个对象的key的hashcode是一样的,这个时候怎么get他的value呢? 答案是通过equals遍历table那个位置上面的 ...
- 从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法
接着上一章节.我们来讨论一下get方法. 1.还是利用上一章节的图 下图引用自:http://www.admin10000.com/document/3322.html 我们简单说一下步骤.就是通过h ...
- 【转】Java学习---HashMap的工作原理
[原文]https://www.toutiao.com/i6592560649652404744/ HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都 ...
- Java中的数据结构有哪些?HashMap的工作原理是什么?
Java中常用数据结构 常用的数据结构有哈希表,线性表,链表,java.util包中有三个重要的接口:List,Set,Map常用来实现基本的数据结构 HashMap的工作原理 HashMap基于ha ...
- Java中的HashMap的工作原理是什么?
问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...
- Java HashMap的工作原理(转载)
原文地址:http://www.importnew.com/10620.html 面试的时候经常会遇见诸如:"java中的HashMap是怎么工作的","HashMap的 ...
- [Java] SSH框架笔记_SSH三大框架的工作原理及流程
Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...
- Java HashMap的工作原理
面试的时候经常会遇见诸如:”java中的HashMap是怎么工作的”.”HashMap的get和put内部的工作原理”这样的问题. 本文将用一个简单的例子来解释下HashMap内部的工作原理. 首先我 ...
随机推荐
- 怎么查看mysql的数据库编码格式
一.查看MySQL数据库服务器和数据库MySQL字符集. show variables like "%char%" 二.查看MySQL数据表(table)的MySQL字符集. sh ...
- java new关键字
//new关键字://1.表示创建一个对象//2.表示实例化对象//3.表示申请内存空间 在python中其实就是一个实例化的过程
- Restful API的设计规范
原文:https://blog.csdn.net/u013063153/article/details/72828164 本文总结了 RESTful API 设计相关的一些原则,只覆盖了常见的场景.有 ...
- MyChatRoom——C#自制聊天室
一个用C#编写的基于Socket的Windows版聊天室,包括服务端和客户端.当服务端启动服务后,客户端可以连接到服务端,给服务端发送数据,服务端可以接收数据:服务端可以给客户端发送数据,客户端接收: ...
- Linux中svn的使用
1. 安装Linux 执行如下命令,中间会出现一次提示,选y即可 yum install subversion 2. 创建资源库位置 svnadmin create /usr/java/testJen ...
- c++ ado 程序终止时崩溃
在_ConnectionPtr析构的时候要将_ConnectionPtr置NULL ADODB::_ConnectionPtr conn;conn.CreateInstance(__uuidof(AD ...
- CTF SQL注入知识点
理解常用的登录判断 select * from user where username='admin' and password='123' 数据库元信息 infomation_schema 懂PHP ...
- MATLAB 的输入输出命令
MATLAB 的输入输出命令: >> A='woshi'; >> disp(A) woshi fscanf和fprintf命令的行为像C scanf和printf函数.他们支持 ...
- mysql--SQL编程(关于mysql中的日期,关于重叠) 学习笔记2.2
1.日期中的重叠问题建表sessions: CREATE TABLE `sessions` ( `id` ) NOT NULL AUTO_INCREMENT, `app` ) NOT NULL, `u ...
- HDU 3062 Party ( 2-sat tarjan)
Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...