• 从头认识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基础5 (一维)数组和二维数组
    Java 内部类
    Java 抽象类和接口
    Java 多态
    Java 继承
    Java 包(package)
    Java String类和StringBuffer类
    Java 数组
    Java 封装与类
    Java 概述和编程基础
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7363435.html
Copyright © 2020-2023  润新知