java HashMap中出现重复的key, 求解释
2014-10-16 00:19
549 查看
上代码:
输出结果:
{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的线程不安全 是 几回事?
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的线程不安全 是 几回事?
相关文章推荐
- java HashMap中出现反复的key, 求解释
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- Java 基础之HashMap key重复值将被覆盖
- java统计List中的元素重复出现的次数和对map按key或键值排序
- hashmap出现重复key的情况
- java HashMap插入重复Key值问题
- [编写高质量代码:改善java程序的151个建议]建议79 HashMap中的key不要重复
- Java中key可以重复的Map集合:IdentityHashMap(转)
- java获取字符串中重复出现的字符
- sql,key id不唯一,导致出现重复数据
- java中hashTable和hashMap的Key的详解
- 运行java.exe 出现Registry key 'Software/JavaSoft/Java Runtime Environment/CurrentVersion'错误的解决
- HashMap中key重复处理
- java HashMap用自定义类作为key
- Hashtable and HashMap are two hash based collection in Java and used to store objects as key value p
- java统计字符串中重复出现字符的个数