引出问题
一个朋友问我,这种写法为什么可以修改值
我说
再探讨一下
创建实例
@Test
public void demo() {
//实例化对象
Person person = new Person("张三");
Map map = new HashMap();
//map中的key:index1 指向 person对象
map.put("index1",person);
//修改对象属性
person.setName("李四");
System.out.println(map.get("index1"));
}
打印结果是
Person [name=李四]
图示
1) 实例化 person 对象时 开辟出一块内存空间, 并在内存地址对应的内存中写入数据
2)使 index1 指向 person 对象, index1 也对应 person 的内存地址
3)通过person对象修改值
内存中的值改变,但是person对象、map中的key对应的内存地址并没有改变
因此 map.get(“index1”)
取值改变
总结
Java中的对象,在实例化的时候会在内存中开辟一块内存空间,这块内存空间是有地址的,称为内存地址,实例化的对象本身并不存储数据,只存放内存地址,所以称为引用对象
(每次使用对象时,都是先获取到内存地址,然后再去内存中找到对应的内存空间,再进行操作)
集合中的key对应的是某个对象的首地址,指向的是某个对象,往对象中加了数据,对象的内容变了,但是对象的首地址没有变,集合中的key仍然指向这个对象的首地址。