当前位置: 首页 > news >正文

Hashmap 键值对的value发生变化,是否需要重新put ?

目录

1.value对象自身属性发生了变化

2.value对象被整个换成其它对象


Hashmap键值对的value发生变化,是否需要重新put,要分2种情况

1.value对象自身属性发生了变化

这种情况下,是不需要重新put的 

import java.util.HashMap;
import java.util.Map;/*** hashmap value对象属性发生变化*/
public class TestAtrributeChangeMain {public static void main(String[] args) {Map< Integer, Stu> mapA=new HashMap<Integer, Stu>();Map<String, Stu> mapB=new HashMap<String, Stu>();Stu stu=new Stu();stu.x=10;stu.y=10;mapA.put(1, stu);mapB.put("1", stu);System.out.println(mapA.get(1).x); //输出10//****** 只是对象自己的属性发生了变化 ******stu.x=5;System.out.println(mapB.get("1").x); //输出5System.out.println(mapA.get(1).equals(mapB.get("1"))); //输出true}
}

2.value对象被整个换成其它对象

这种情况下,如果只将stu引用指向一个新的对象,是不会对hashmap中已有的value对象进行改变的。如果想让hashmap中的value引用指向新的对象,那么必须重新进行put,这是为什么呢?

import java.util.HashMap;
import java.util.Map;/*** hashmap value对象被整个换成其它对象*/
public class TestObjectReplaceMain {public static void main(String[] args) {Map< Integer, Stu> mapA=new HashMap<Integer, Stu>();Map<String, Stu> mapB=new HashMap<String, Stu>();Stu stu = new Stu();stu.x=10;stu.y=10;mapA.put(1, stu);mapB.put("1", stu);System.out.println(mapA.get(1).x); //输出10//stu引用指向新的对象stu = new Stu();stu.x = 20;stu.y = 20;System.out.println(mapB.get("1").x); //输出10System.out.println(mapA.get(1).equals(mapB.get("1"))); //输出true//拿String对象来测试呢?Map<String,String> mapStr = new HashMap<>();String str = "11111";mapStr.put("1",str);System.out.println(mapStr.get("1")); //打印 11111str = "222222";System.out.println(mapStr.get("1")); //仍然打印 11111}
}

 原因:

stu引用跟hashmap中的引用不是同一个引用,虽然它们一开始都指向同一个对象stu;后面stu引用指向了一个新的对象,但是hashmap中的引用并没有,而是仍然指向原来的stu对象,所以hashmap中的value没有任何变化,如果想让其指向最新的对象,那么必须重新put

Note: 

不管拿Stu对象还是String对象进行测试,效果都是一样的 

stu引用指向新对象后

hashmap的value引用一直指向原对象。 


http://www.mrgr.cn/news/94209.html

相关文章:

  • Redis Sentinel (哨兵模式)深度解析:构建高可用分布式缓存系统的核心机制
  • 【深度学习】多元物料融合算法(一):量纲对齐常见方法
  • Linux机器之间排查网络连通问题
  • winform中chart控件解决显示大量曲线数据卡顿方法——删旧添新法
  • AI自动化编程初探
  • 机器人路径规划、轨迹优化系列课程
  • k8s面经
  • Django与模板
  • 27_Java2DRenderer结合freemarker动态生成图片
  • 【Linux内核系列】:文件系统
  • 本地部署 OpenManus 保姆级教程(Windows 版)
  • 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】
  • 11 | 给 Gin 服务器添加中间件
  • Spring之生命周期Bean的生成过程
  • 看 MySQL InnoDB 和 BoltDB 如何写磁盘
  • uni-app打包成H5使用相对路径
  • C# Enumerable类 之 集合操作
  • c#面试题整理9
  • linux - ubuntu 使用时一些小问题整理 --- 持续更新
  • 数据结构——单链表list