java HashMap中出现重复的key, 求解释

上代码:

        Person p1 = new Person("xiaoer",1);
        Person p2 = new Person("san",4);

        Map<Person,String> maps = new HashMap<Person,String>();
        maps.put(p1, "1111");
        maps.put(p2, "2222");
        System.out.println(maps);

        maps.put(p2, "333");
        System.out.println(maps);

        p1.setAge(5);
        System.out.println(maps);

        maps.put(p1, "333");
        System.out.println(maps);
        System.out.println(maps.get(p1));

输出结果:

{Person [name=san, age=4]=2222, Person [name=xiaoer, age=1]=1111}

{Person [name=san, age=4]=333, Person [name=xiaoer, age=1]=1111}

{Person [name=san, age=4]=333, Person [name=xiaoer, age=5]=1111}

{Person [name=san, age=4]=333, Person [name=xiaoer, age=5]=1111, Person [name=xiaoer, age=5]=333}

333

重点关注 红色的 标注。

其中Person类如下:

class Person{
    private String name;
    private int age;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

why?   输出的maps 出现了相同的key。

初步 判断 和  HashMap的 hashcode机制有关, 只在第一次 将 元素  add 加入map时,检测元素key的 hash值。 之后我通过外部 手段 更改了对象的值,再将 该对象加入 map,其实 从hashcode来看 已经是一个新的 对象了,故 map认为他们的key 不同。HashMap为了提高校验速度,并不会 将待增的元素 与 map中已有的所有元素 一 一 比较,而只是快速的比较hashcode table 表?    虽然从物理内存上看 他们的确是 同一个对象。

java 这样设计的原理 何在?

这样其实存在不安全性。 譬如 我将一个 hashMap对象 传给了 方法A 去处理,结果A还在处理中的 时候,我把hashMap对象的里面的一个元素的值 给 简介更改了,而A 竟然还不知情。

与 HashMap的线程不安全 是 几回事?

时间: 2024-10-15 09:35:16

java HashMap中出现重复的key, 求解释的相关文章

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

Java学习笔记--HashMap中使用object做key的问题【转载】

在HashMap中,如果需要使用多个属性组合作为key,可以将这几个属性组合成一个对象作为key.但是存在的问题是,要做get时,往往没办法保存当初put操作时的key object的reference,此时,需要让key object覆盖如下hashCode()和equals(Object obj)的实现.sample code如下: public class TestKeyObject { private long id; private int type; public TestKeyOb

Java代码中获取Json的key值

测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym4iTZ3-ptWRRoVtbCNJnyjGLfed_4bB0HiqGP8v-aXOJUUk1tFs","expires_in":7200,"refresh_token":"_or_31yEp8XhxGWvrAzdWIkXfFlKjfb3iTRpfa

Java开发中的23种设计模式具体解释

public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("sms"); sender.Send(); } } 输出:this is sms sender! 22.多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,假设传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建

java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)

一.Jdbc访问数据库步骤通俗解释(吃饭) 1)加载驱动 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServer”); 2) 与数据库建立连接 Connection ct=DreverManager.getConnection(“jdbc:Microsoft:sqlserver://localhost:1433;DatabaseName=dbUser,”sa”,”sa”); 3) 创建statement对象 语句对象将sql语句发送到相应的数据

[Java] HashMap源码分析

1.概述 Hashmap继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口.它的key.value都可以为null,映射不是有序的. Hashmap不是同步的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap. Map map = Collections.synchronizedMap(new HashMap()); (除了不同步和允许使用 null 之

JAVA hashmap知识整理

HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题.Hashtable是个过时的集合类,存在于Java API中很久了.在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分.Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合

JAVA HashMap详细介绍和示例

第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的. HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子&quo

java自定义类型 作为HashMap中的Key值 (Pair&lt;V,K&gt;为例)

由于是自定义类型,所以HashMap中的equals()函数和hashCode()函数都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals函数,应该就相当于c++重载==运算符来保证能判断是否相等.只不过java没有自定义重载运算符这个功能的,需要进行函数覆盖. equals的函数原型是 boolean equals(Object o);注意括号内.hashCode的函数原型就是int hashCode(); 先看一段代码: import