菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
49
0

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

原创
05/13 14:22
阅读数 39724

这一章节我们讨论一个比較特殊的情况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的工作原理。


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

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

文件夹


发表评论

0/200
49 点赞
0 评论
收藏
为你推荐 换一批