为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的引用类型是按引用还是按值分配?

Java中的引用类型是按引用还是按值分配?

幕布斯6054654 2023-08-16 09:58:15
据我所知,在Java中引用类型是按值分配的,但我无法理解为什么下面的代码会执行它的操作。考虑以下代码:Integer num = new Integer(11);List<Integer> arr = new ArrayList<>();arr.add(num);List arr2 = arr;arr = null;System.out.println(arr2);我们创建一个包含一个元素的 ArrayList,然后创建第二个列表并将其分配给第一个列表。据我了解,第二个列表仅指向与第一个列表相同的内存位置,因此我对第一个列表所做的任何更改都将应用于第二个列表。如果我将第一个列表设置为空,那么第二个列表也应该变为空。为什么控制台仍然记录 11 而不是 null?
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

这就是后台发生的事情。我会尝试将其形象化,以便于理解。


创建整数对象:


Integer num = new Integer(11);

num --> @num493857 (some reference not real of course)

@num493857 --> ------

               | 11 |

               ------

创建数组列表:


List<Integer> arr = new ArrayList<>();

arr --> @arr7686

@arr7686 --> [] (empty list)

将 num 添加到 Arraylist:


arr.add(num);

arr --> @arr7686 --> [@num493857] // @num493857 has 11 in it

                         ^

                         |

                        num

设置 arr2 = arr:


List arr2 = arr;

arr --> @arr7686 --> [@num493857]

           ^             ^

           |             |

          arr2          num

设置 arr = null:


arr = null

arr --> null

        @arr7686 --> [@num493857]

           ^             ^

           |             |

          arr2          num

打印arr2:


System.out.println(arr2);

This prints whatever is in the list that is 11.


查看完整回答
反对 回复 2023-08-16
?
LEATH

TA贡献1936条经验 获得超6个赞

如果您将 Java 变量与C 中的引用而不是指针进行比较,就会更容易理解。



查看完整回答
反对 回复 2023-08-16
  • 2 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信