一、问题引出
先是在 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