zoukankan      html  css  js  c++  java
  • 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的线程不安全 是 几回事?







  • 相关阅读:
    90%的人不知道Python炫技的7个骚操作
    想查看微信好友撤回的消息?Python帮你搞定
    Python统计长字符串中字符频次【入门必学】
    用什么库写Python命令行程序?80%的人都用错了
    Python文件操作方法,看这篇就足够
    Python单例模式最佳实战【入门必学】
    学Python,连yield关键字你都不会用就太失败了吧?
    编译原理--引论(四)
    编译原理--引论(三)
    2012年英语一小作文
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4369844.html
Copyright © 2011-2022 走看看