javaHashMap中出现反复的key, 求解释

it2025-08-11  10

上代码:

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的线程不安全 是 几回事?

转载于:https://www.cnblogs.com/bhlsheji/p/4369844.html

最新回复(0)