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引用一直指向原对象。