Map get(K key)方法中隐藏的引用问题

一、问题引出

先是在 map中存放了 几个Student对象,然后 通过 map 的get(key) 方法,赋值给一个 声明的Student对象,然后调用了 student 的set方法,改变属性,发现 map中的对应的位置上面的 Student 对象中的属性也发生了变化

二、示例代码

package char01.testmap;  public class Student { private String nameString; private String sex;  //省略 getter setter 和构造函数 toString() 函数  ....  }

有问题的代码 下面的 28 - 30

package char01.testmap;  import java.util.HashMap;  /*  * 验证 map的 set 和get 方法  */  public class TestGetSetOfMap {  public static void main(String[] args) {  // TODO Auto-generated method stub HashMap<String,Student> map=new HashMap<String,Student>(); Student student01=new Student("htb01","男");  Student student02=new Student("htb02","男"); Student student03=new Student("htb03","男"); Student student04=new Student("htb04","男");  map.put(student01.getNameString(), student01); map.put(student02.getNameString(), student02); map.put(student03.getNameString(), student03); map.put(student04.getNameString(), student04);  for(Student student:map.values()){  System.out.println(student.getNameString()); System.out.println(student.getSex());  }  //下面的一段 有疑惑  Student studentGet=map.get("htb01"); studentGet.setNameString("htb0111111");  studentGet.setSex("女");  for(Student student:map.values()){  System.out.println(student.getNameString()); System.out.println(student.getSex());  }  }

输出的结果是

Map get(K key)方法中隐藏的引用问题

疑惑点

之前对于 map 中的get方法,本人的理解是 get之后,把拿出来的 student 对象 赋值给 刚刚声明的studentGet 对象之后,修改 studentGet 的属性,应该不会影响到原来 map中存放的 student 的属性但是结果是 修改了 studentGet 的属性 之后,map中的对应位置上的 student对象的属性的值也发生了变化

内存模型展示

Map get(K key)方法中隐藏的引用问题

联想其他的引用数据类型

String 类型 数组类型 String类型

String类型

package char01.testmap;  public class TestString {  public static void main(String[] args) {  // TODO Auto-generated method stub  String string01="aaaaa"; String string02=string01;  //  String string02=new String(string01);  System.out.println(string01); System.out.println(string02);  System.out.println("*********");  string02="bbb";  System.out.println(string01); System.out.println(string02);  }  }

输出结果

Map get(K key)方法中隐藏的引用问题

数组

package char01.testmap;  import java.util.Arrays; public class TestArray {  public static void main(String[] args) {  int[] array01=new int[]{1,2,3};  //  int[] array02=null;  int[] array02=new int[]{4,5,6}; System.out.println(array02);  array02=array01;  System.out.println(array01); System.out.println(array02);  System.out.println(Arrays.toString(array01)); System.out.println(Arrays.toString(array02));  System.out.println("******************");  //修改 array01 的值,验证是否会影响 array02 的值  array01[0]=6; array01[1]=6;  array01[2]=6;  System.out.println(Arrays.toString(array01));  System.out.println(Arrays.toString(array02));  }  }

Map get(K key)方法中隐藏的引用问题

输出的结果

数组赋值之后,* array02=array01; * array01 的指针就指向了 array02 的头部,所以 array01 的空间就失效了,等待回收,两个数组名 都指向了同一块内存,所以数据也是一样的。

内存模型展示

Map get(K key)方法中隐藏的引用问题

语句 array02=array01 ; 之后 里面的 array02指向 array02 的空间,发生了变化,指向了array 01

Map get(K key)方法中隐藏的引用问题

Map get(K key)方法中隐藏的引用问题

Map get(K key)方法中隐藏的引用问题

Map get(K key)方法中隐藏的引用问题

Map get(K key)方法中隐藏的引用问题

Map get(K key)方法中隐藏的引用问题

array01

您可能还会对下面的文章感兴趣: