爲什麼有時我們不需要創建一個對象,只需將它分配給方法等?以下面爲例。爲什麼在這種情況下不需要實例化對象?
List<String> list1 = new ArrayList<>();
List<String> list2 = Collections.synchronizedList(list1);
這是否意味着list2
被分配了一個ArrayList對象?在這種情況下內存分配會發生什麼?謝謝!
爲什麼有時我們不需要創建一個對象,只需將它分配給方法等?以下面爲例。爲什麼在這種情況下不需要實例化對象?
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()
返回一個對new SynchronizedList()
對象的內存引用,通過調用它可以將該內存位置分配給list2
對象。
總是需要對象實例化。在Java中有兩個內存區域:線程堆棧和堆。
new
關鍵字在堆在你的情況下,在方法Collections.synchronizedList
實例化的List
對象將在Heap和參考這個名單被分配分配將被分配到局部變量list2