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值不允许重复问题相关推荐

  1. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 1 package com.zdz.test; ...

  2. mysql primary重复_mysql中primary key重复时的处理办法

    mysql中primary key重复时的处理办法 文章作者:网友投稿 发布时间:2010-03-14 22:25:52 来源:网络 当insert进数据表, 发生唯一key(unique key与p ...

  3. java map移除key为空_Java实现过滤掉map集合中key或value为空的值示例

    本文实例讲述了Java实现过滤掉map集合中key或value为空的值.分享给大家供大家参考,具体如下: import java.util.Collection; import java.util.H ...

  4. Java过滤掉map集合中key或value为空的值

    import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.M ...

  5. Java将map置空_Java实现过滤掉map集合中key或value为空的值示例

    Java实现过滤掉map集合中key或value为空的值示例 发布时间:2020-09-16 23:26:14 来源:脚本之家 阅读:147 作者:May的博客 本文实例讲述了Java实现过滤掉map ...

  6. hashmap hash冲突怎么解决_HashMap原理及冲突之简谈

    了解HashMap原理对于日后的缓存机制多少有些认识.在网络中也有很多方面的帖子,但是很多都是轻描淡写,很少有把握的比较准确的信息,在这里试着不妨说解一二. 对于HashMap主要以键值(key-va ...

  7. hashmap hash冲突怎么解决_hashMap怎么解决hash冲突的

    学Java的都知道hashMap的底层是"链表散列"的数据结构也也可以说是hash表.在put的实话先根据key的hashcode重新计算hash值的,而我们又知道hash是一种算 ...

  8. 当我发现Python字典中不同key可以有相同哈希值后——问渠那得清如许

    迷雾重重 我们知道,字典的key是不同重复的.那么Python怎么比较两个key是否相同呢?在回答这个问题之前,先来看一段代码. class Position():def __init__(self, ...

  9. 累加 map java_Java Map key 不存在时设置初始值,存在时累加计算值的设计方案

    在 java 中使用 Map 时,针对 key 进行数值的累计运算,需要指定键不存在时,设置初始值,特定 key 存在时,对已有键值进行累加. 参考方案 java 8 中,Map 中增加了 getOr ...

最新文章

  1. 一个python程序员需要掌握的知识-python初学者搭建网站需要了解的基础知识
  2. python快速编程入门教程-python从入门到精通之30天快速学python视频教程
  3. ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1
  4. linux中的nm命令
  5. C语言equal(),C ++中的std :: equal()
  6. 锁的释放流程-ReentrantLock.tryRelease
  7. [html] 你能否画出一个0.5px的直线?
  8. zabbix触发器表达式
  9. java基础-java语言中的关键字总结
  10. 09hibernate_session_flush
  11. 码云git上传下载代码
  12. 【北京迅为】i.MX6ULL终结者Linux RS232/485驱动实验RS232驱动
  13. 转换PDF技巧1之PDF虚拟打印机操作详解
  14. Java毕业设计-企业员工考勤打卡管理系统
  15. 计算机网络题库与答案西电,西电计算机网络期末试题.doc
  16. 面对换领导或空降管理者,该怎么办?
  17. 敏捷史话系列(一)| 用一半的时间做两倍的事——Jeff Sutherland
  18. Pyhton零基础投喂(综合练习:2:论⽂作者统计)
  19. one algorithm a day keeps the doctor away -- BubbleSort
  20. 发现在创建云服务器ecs实例的磁盘快照时_阿里云服务器怎么重装系统 阿里云VPS如何重装系统...

热门文章

  1. smart700iev3 程序下载设置_smart line 700ie v3触摸屏下载不了程序-工业支持中心-西门子中国...
  2. 大鱼吃小鱼 C++ - 栈与非栈
  3. android中setdate不是静态,android – putExtra()和setData()之间的区别
  4. 区块链技术助力实现“资产通证化”
  5. 关于WinExec的问题?
  6. Java 基础知识测试-1
  7. 北京VS上海:“活着为了工作”还是“工作为了生活”?
  8. MySQL入门代码(附案例)
  9. Nginx可视化配置神器
  10. EPSON L130X WIFI软件安装