博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java HashMap中出现反复的key, 求解释
阅读量:6572 次
发布时间:2019-06-24

本文共 2232 字,大约阅读时间需要 7 分钟。

上代码:

Person p1 = new Person("xiaoer",1);        Person p2 = new Person("san",4);        Map
maps = new HashMap
(); 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的线程不安全 是 几回事?

转载地址:http://awljo.baihongyu.com/

你可能感兴趣的文章
关于svn和maven结合使用的讨论
查看>>
前端第五天
查看>>
shell脚本学习之for循环
查看>>
MFC用CFile写文件
查看>>
stark组件(1):动态生成URL
查看>>
169. Majority Element
查看>>
Django Form表单学习总结
查看>>
大整数加法
查看>>
下拉菜单
查看>>
C/C++中extern关键字详解
查看>>
[清华集训2014]玛里苟斯
查看>>
Doctype作用?严格模式与混杂模式如何区分?它们有何意义
查看>>
jquery选择器(可见对象,不可见对象) +判断,对象(逆序)
查看>>
0029-求最小的数
查看>>
【MVC+EasyUI实例】对数据网格的增删改查(上)
查看>>
Socket编程
查看>>
python2.7_1.14_编写一个简单的回显客户端/服务器应用
查看>>
Android-Handler更新View加线程
查看>>
第三章:如何建模服务
查看>>
EF CodeFirst下数据库更新
查看>>