zoukankan      html  css  js  c++  java
  • 从头认识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的工作原理。


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

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

    文件夹


  • 相关阅读:
    WSP部署错误—SharePoint管理框架中的对象“SPSolutionLanguagePack Name=0”依赖其他不存在的对象
    Elevate Permissions To Modify User Profile
    Error with Stsadm CommandObject reference not set to an instance of an object
    ASP.NET MVC3添加Controller时没有Scaffolding options
    测试使用Windows Live Writer写日志
    配置TFS 2010出现错误—SQL Server 登录的安全标识符(SID)与某个指定的域或工作组帐户冲突
    使用ADO.NET DbContext Generator出现错误—Unable to locate file
    CSS
    HTML DIV标签
    数据库
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7363435.html
Copyright © 2011-2022 走看看