2017-02-14 206 views
0

爲什麼有時我們不需要創建一個對象,只需將它分配給方法等?以下面爲例。爲什麼在這種情況下不需要實例化對象?

List<String> list1 = new ArrayList<>(); 
List<String> list2 = Collections.synchronizedList(list1); 

這是否意味着list2被分配了一個ArrayList對象?在這種情況下內存分配會發生什麼?謝謝!

回答

1

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對象。

1

總是需要對象實例化。在Java中有兩個內存區域:線程堆棧和堆。

  • 基元(即變量不是對象)等布爾值,字節,短,字符型,整型,長整型,浮點,雙,被存儲在線程堆棧
  • 對象了與創建在new關鍵字在堆

在你的情況下,在方法Collections.synchronizedList實例化的List對象將在Heap和參考這個名單被分配分配將被分配到局部變量list2

相關問題