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方法,本人的理解是 get之后,把拿出来的 student 对象 赋值给 刚刚声明的studentGet 对象之后,修改 studentGet 的属性,应该不会影响到原来 map中存放的 student 的属性但是结果是 修改了 studentGet 的属性 之后,map中的对应位置上的 student对象的属性的值也发生了变化
内存模型展示
联想其他的引用数据类型
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); } }
输出结果
数组
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)); } }
输出的结果
数组赋值之后,* array02=array01; * array01 的指针就指向了 array02 的头部,所以 array01 的空间就失效了,等待回收,两个数组名 都指向了同一块内存,所以数据也是一样的。
内存模型展示
语句 array02=array01 ; 之后 栈里面的 array02指向 array02 的空间,发生了变化,指向了array 01
array01