Java 中的引用类型是按引用还是按值分配的?
Are Reference types in Java assigned by reference or value?
据我所知,在 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?
如果你比较Java变量不是C中的references,而是pointers比较容易理解。
这就是后台发生的事情。我将尝试将其可视化,以便于理解。
正在创建整数对象:
Integer num = new Integer(11);
num --> @num493857 (some reference not real of course)
@num493857 --> ------
| 11 |
------
正在创建 ArrayList:
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.
据我所知,在 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?
如果你比较Java变量不是C中的references,而是pointers比较容易理解。
这就是后台发生的事情。我将尝试将其可视化,以便于理解。
正在创建整数对象:
Integer num = new Integer(11);
num --> @num493857 (some reference not real of course)
@num493857 --> ------
| 11 |
------
正在创建 ArrayList:
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.