优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2024-09-03 16:34:19 技术文章 5 ℃

一、问题引出

先是在 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

Tags:

最近发表
标签列表