Map的get(K key)方法,引申 Array 和String

一、问题引出

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

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值