package hashMap;import java.util.HashMap;
import java.util.Map;/* * 可变对象是指创建后自身状态能改变的对象。换句话说,可变对象是该对象在创建后它的哈希值可能被改变。在下面的代码中,对象MutableKey的键在创建时变量 i=10 j=20,哈希值是1291。然后我们改变实例的变量值,该对象的键 i 和 j 从10和20分别改变成30和40。现在Key的哈希值已经变成1931。显然,这个对象的键在创建后发生了改变。所以类MutableKey是可变的。*/
class MutableKey {private int i;private int j;public MutableKey(int i, int j) {this.i = i;this.j = j;}public final int getI() {return i;}public final void setI(int i) {this.i = i;}public final int getJ() {return j;}public final void setJ(int j) {this.j = j;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + i;result = prime * result + j;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null) {return false;}if (!(obj instanceof MutableKey)) {return false;}MutableKey other = (MutableKey) obj;if (i != other.i) {return false;}if (j != other.j) {return false;}return true;}
}public class objectAsKey {private static void simulateObjectLost() {// HashMapMap<MutableKey, String> map = new HashMap<>();// Object createdMutableKey key = new MutableKey(10, 20);// Insert entry.map.put(key, "Robin");// This line will print 'Robin'System.out.println(map.get(key));// Object State is changed after object creation.// i.e. Object hash code will be changed.key.setI(30);// This line will print null as Map would be unable to retrieve the entry.System.out.println(map.get(key));}public static void main(String[] args) {// Object createdMutableKey key = new MutableKey(10, 20);System.out.println("Hash code: " + key.hashCode());// Object State is changed after object creation.key.setI(30);key.setJ(40);System.out.println("Hash code: " + key.hashCode());simulateObjectLost();}
}

使用可变对象作为Java Map的key,会带来潜在风险的一个例子相关推荐

  1. Java Map的key不区分大小写

    Map的key为String,根据业务需求key对大小写不敏感 使用 org.apache.commons.collections.map.CaseInsensitiveMap; Map<Str ...

  2. java map存放班级和姓名_Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...

    |--需求说明 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entry里面 ...

  3. java map 随机取值_随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value...

    利用Java提供的Random类.从List或Set中随机取出一个元素,从Map中随机获取一个key或value. 因为Set没有提供get(int index)方法,仅仅能先获取一个随机数后.利用一 ...

  4. java map按照key排序_java Map排序(按key和按value)

    1.按照key排序 对于java中Map的排序,有排序Map,比如TreeMap,对于这个Map,首先只能按照键排序,其次再put和remove的时候由于需要排序,性能上会有所牺牲. 这种方案,使用h ...

  5. java socket 线程池_java socket编程的一个例子(线程池)

    服务器程序EchoServer.java: import java.io.*; import java.net.*; import java.util.concurrent.*; public cla ...

  6. Java多线程--设计模式(二、Immutable Object(不可变对象)模式)

    一.Immutable Object 模式简介 多线程共享变量的情况下,为了保证数据的一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object 模式使 ...

  7. Java中Map获取key和value

    Java Map获取key和value的方法 List<Map<String,Object>> list  =new ArrayList<Map<String,Ob ...

  8. 并发编程-10线程安全策略之不可变对象

    文章目录 脑图 四个线程安全策略 不可变对象定义 不可变对象需要满足的条件 如何创建不可变对象 使用final关键字定义不可变对象 修饰变量示例 final修饰基本数据类型及String: 初始化之后 ...

  9. Java Map集合

    Map集合: Map接口 Map与List.Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射.同时它也没有继承Collection.在Map中它保证了key与value之间 ...

最新文章

  1. mysql日常有哪些用_mysql日常笔记(持续更新)
  2. 逆向建模软件介绍_逆向技术在2代机修理中的应用
  3. VHDL中的分辨函数
  4. python 调用文件上传图片简单例子
  5. matepad和鸿蒙,上手华为新 MatePad Pro :搭载鸿蒙系统后,生产力有何不同?
  6. hdu 6348 序列计数
  7. 国自然的技术路线图?用PPT试试
  8. SAP CO_PA(获利能力分析)专题:业务数据流及BW建模
  9. SVT和ULVTcell比较
  10. commitizen和cz-customizable配置git commit message
  11. php如何获取视频文件分辩率,视频分辨率怎么看 查看视频分辨率、帧率、尺寸、以及编码器等详细参数...
  12. DAY9:尚学堂高琪JAVA(98)
  13. 怎么修改手机app服务器数据库,手机app服务器数据库
  14. vue实现调查问卷一页一题,上一题下一题形式
  15. JMeter Dummy sampler结果乱码 及 正则表达式提取器乱码的解决
  16. Adobe photshop 安装过程中的问题
  17. 梦幻西游手游转区没服务器显示不出来,《梦幻西游手游》怎么转服 转服需要满足条件介绍...
  18. Ajax 前后端数据交互
  19. 互联网企业安全高级指南读书笔记之基础安全措施
  20. 并发编程常见面试题Synchronized 相 关 问 题

热门文章

  1. mac下搭建lua环境
  2. 看反病毒专家对EICAR检测代码的专业解读
  3. [无处悲伤]年华世事两迷离
  4. 从零写一个编译器(六):语法分析之表驱动语法分析
  5. Python循环定时服务功能(相似contrab)
  6. FLV视频在IIS6.0下不能播放 处理的方法
  7. 为窗体添加 最大化,最小化,还原等 事件
  8. 比较 J2EE,eclipse adt扩展和Android studio几个类似IDE菜单的异同点
  9. 文献记录(part58)--不平衡数据处理的新方法一基于样本相似度的少数合成法
  10. 《复杂》读书笔记(part3)--熵