为什么在某些情况下不需要对象实例化?
Why object instantiation is not needed in some cases such as this?
为什么有时我们不必创建对象而只需将其分配给方法等?以下面的为例。
List<String> list1 = new ArrayList<>();
List<String> list2 = Collections.synchronizedList(list1);
这是否意味着 list2
被分配了一个 ArrayList 对象?在这种情况下,内存分配会发生什么变化?谢谢!
List2 分配有列表的一些实现。在确切的情况下,它是 SynchronizedRandomAccessList
对象或 SynchronizedList
对象,但不是 ArrayList
.
Here是源码:
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<>(list) :
new SynchronizedList<>(list));
}
静态方法synchronizedList()
在这种情况下只是一个帮手。 java 中的对象(不是原始值)用于传递对内存位置的引用。所以 synchronizedList()
returns 对 new SynchronizedList()
对象的内存引用,通过调用它,您将该内存位置分配给 list2
对象。
总是需要对象实例化。在 Java 中有两个内存区域:Thread Stack 和 Heap。
- 基元(即不是对象的变量),如布尔、字节、短、字符、整数、长、浮点、双精度,存储在线程堆栈中
- 使用
new
关键字创建的对象分配在堆 中
在您的情况下,方法 Collections.synchronizedList
中实例化的 List
对象将在堆中分配,并且对该列表的引用将分配给局部变量 list2
为什么有时我们不必创建对象而只需将其分配给方法等?以下面的为例。
List<String> list1 = new ArrayList<>();
List<String> list2 = Collections.synchronizedList(list1);
这是否意味着 list2
被分配了一个 ArrayList 对象?在这种情况下,内存分配会发生什么变化?谢谢!
List2 分配有列表的一些实现。在确切的情况下,它是 SynchronizedRandomAccessList
对象或 SynchronizedList
对象,但不是 ArrayList
.
Here是源码:
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<>(list) :
new SynchronizedList<>(list));
}
静态方法synchronizedList()
在这种情况下只是一个帮手。 java 中的对象(不是原始值)用于传递对内存位置的引用。所以 synchronizedList()
returns 对 new SynchronizedList()
对象的内存引用,通过调用它,您将该内存位置分配给 list2
对象。
总是需要对象实例化。在 Java 中有两个内存区域:Thread Stack 和 Heap。
- 基元(即不是对象的变量),如布尔、字节、短、字符、整数、长、浮点、双精度,存储在线程堆栈中
- 使用
new
关键字创建的对象分配在堆 中
在您的情况下,方法 Collections.synchronizedList
中实例化的 List
对象将在堆中分配,并且对该列表的引用将分配给局部变量 list2