hashmap 允许key重复吗_HashMap的key值不允许重复问题
package com.wang.testMianShi;
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//测试hashCode
// @Override
// public boolean equals(Object obj) {
// // TODO Auto-generated method stub
// return true;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = 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;
}
// @Override
// public String toString() {
// return "Person [name=" + name + ", age=" + age + "]";
// }
}
package com.wang.testMianShi;
import java.util.HashMap;
import java.util.Map;
public class testHashMap {
public static void main(String[] args) {
//
Person p1 = new Person("tom", 18);
Person p2 = new Person("jack", 19);
Map hMap5 = new HashMap<>();
hMap5.put(p1, "1111");
hMap5.put(p2, "2222");
System.out.println(hMap5 +"--"+ hMap5.size()); //2
p1.setAge(5);
System.out.println(hMap5);
hMap5.put(p1, "333");
System.out.println(hMap5);
System.out.println(hMap5.get(p1));
}
}
奇葩的是竟然允许key重复,而且引用地址相同,都是com.wang.testMianShi.Person@1c5ae
{com.wang.testMianShi.Person@31aded=2222, com.wang.testMianShi.Person@1c741=1111}–2
{com.wang.testMianShi.Person@31aded=2222, com.wang.testMianShi.Person@1c5ae=1111}
{com.wang.testMianShi.Person@1c5ae=333, com.wang.testMianShi.Person@31aded=2222, com.wang.testMianShi.Person@1c5ae=1111}
推荐你看下Map的原理
map在存放值的时候不是用的对象的地址,而是用的对象的hashcode
你先将p1作为key放进map,
然后更改了p1的值,这时候p1的hashcode已经改变了,再次存放时map以为是不同的key,所以就存进去了。
以下是HashMap.put的内部实现
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
p1.setAge(5)之后p1的hashCode就改变了,上述函数中hash(key)就发生了变化,虽然key是相同的对象,但是HashMap还是将其作为一个新key存储了。
出于效率的考虑,这种场景就不被支持了。算是是HashMap的一个坑吧。
hashmap 允许key重复吗_HashMap的key值不允许重复问题相关推荐
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...
java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 1 package com.zdz.test; ...
- mysql primary重复_mysql中primary key重复时的处理办法
mysql中primary key重复时的处理办法 文章作者:网友投稿 发布时间:2010-03-14 22:25:52 来源:网络 当insert进数据表, 发生唯一key(unique key与p ...
- java map移除key为空_Java实现过滤掉map集合中key或value为空的值示例
本文实例讲述了Java实现过滤掉map集合中key或value为空的值.分享给大家供大家参考,具体如下: import java.util.Collection; import java.util.H ...
- Java过滤掉map集合中key或value为空的值
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.M ...
- Java将map置空_Java实现过滤掉map集合中key或value为空的值示例
Java实现过滤掉map集合中key或value为空的值示例 发布时间:2020-09-16 23:26:14 来源:脚本之家 阅读:147 作者:May的博客 本文实例讲述了Java实现过滤掉map ...
- hashmap hash冲突怎么解决_HashMap原理及冲突之简谈
了解HashMap原理对于日后的缓存机制多少有些认识.在网络中也有很多方面的帖子,但是很多都是轻描淡写,很少有把握的比较准确的信息,在这里试着不妨说解一二. 对于HashMap主要以键值(key-va ...
- hashmap hash冲突怎么解决_hashMap怎么解决hash冲突的
学Java的都知道hashMap的底层是"链表散列"的数据结构也也可以说是hash表.在put的实话先根据key的hashcode重新计算hash值的,而我们又知道hash是一种算 ...
- 当我发现Python字典中不同key可以有相同哈希值后——问渠那得清如许
迷雾重重 我们知道,字典的key是不同重复的.那么Python怎么比较两个key是否相同呢?在回答这个问题之前,先来看一段代码. class Position():def __init__(self, ...
- 累加 map java_Java Map key 不存在时设置初始值,存在时累加计算值的设计方案
在 java 中使用 Map 时,针对 key 进行数值的累计运算,需要指定键不存在时,设置初始值,特定 key 存在时,对已有键值进行累加. 参考方案 java 8 中,Map 中增加了 getOr ...
最新文章
- 一个python程序员需要掌握的知识-python初学者搭建网站需要了解的基础知识
- python快速编程入门教程-python从入门到精通之30天快速学python视频教程
- ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1
- linux中的nm命令
- C语言equal(),C ++中的std :: equal()
- 锁的释放流程-ReentrantLock.tryRelease
- [html] 你能否画出一个0.5px的直线?
- zabbix触发器表达式
- java基础-java语言中的关键字总结
- 09hibernate_session_flush
- 码云git上传下载代码
- 【北京迅为】i.MX6ULL终结者Linux RS232/485驱动实验RS232驱动
- 转换PDF技巧1之PDF虚拟打印机操作详解
- Java毕业设计-企业员工考勤打卡管理系统
- 计算机网络题库与答案西电,西电计算机网络期末试题.doc
- 面对换领导或空降管理者,该怎么办?
- 敏捷史话系列(一)| 用一半的时间做两倍的事——Jeff Sutherland
- Pyhton零基础投喂(综合练习:2:论⽂作者统计)
- one algorithm a day keeps the doctor away -- BubbleSort
- 发现在创建云服务器ecs实例的磁盘快照时_阿里云服务器怎么重装系统 阿里云VPS如何重装系统...
热门文章
- smart700iev3 程序下载设置_smart line 700ie v3触摸屏下载不了程序-工业支持中心-西门子中国...
- 大鱼吃小鱼 C++ - 栈与非栈
- android中setdate不是静态,android – putExtra()和setData()之间的区别
- 区块链技术助力实现“资产通证化”
- 关于WinExec的问题?
- Java 基础知识测试-1
- 北京VS上海:“活着为了工作”还是“工作为了生活”?
- MySQL入门代码(附案例)
- Nginx可视化配置神器
- EPSON L130X WIFI软件安装