簡體   English   中英

java.util.Arrays中的私有靜態類ArrayList - 為什么?

[英]private static class ArrayList in java.util.Arrays - Why?

在java.util.Arrays中,定​​義了一個名為“ArrayList”的私有靜態類。 它僅從Arrays.asList方法引用。

這樣做有什么好處? 為什么不引用java.util.ArrayList呢?

代碼如下:

   /**
    * @serial include
    */
      private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable

盡管private static ArrayList類與java.util.ArrayList具有相同的名稱, 但它們的設計行為卻不同 鑒於此,沒有理由認為實現應該是同一個。

Arrays#asList()返回由指定數組支持的固定大小的列表。 (對返回列表的更改“直寫”到數組。)此方法充當基於數組的API和基於集合的API之間的橋梁。

這樣做有什么好處? 為什么不引用java.util.ArrayList呢?

一個原因是實際的實現類不是公共API細節。 這樣做意味着他們可以在將來更改它的實現類...而不會有破壞客戶代碼的風險。

執行此操作的另一個原因是此私有類以不同於ArrayList的方式實現某些操作。 特別是涉及更改列表大小的操作需要實現以拋出異常...以符合Arrays.asList(...)方法的javadocs中指定的行為。

實際上, Arrays.asList(...)返回的列表是原始數組的包裝器,而不是完整的函數列表。 這有利有弊:

  • 在不利方面,某些操作不起作用。

  • 從好的方面來說,創建一個包裝器要比從一個數組中創建一流列表要便宜得多。 (后者需要將數組內容復制到列表中......對於大型數組而言,這將是昂貴的。)

此外,還存在這樣的問題:通過包裝器可以看到對原始數組的更改(反之亦然)......如果您需要它,這可能很有用。


你在評論中問了這個問題:

a)為什么要返回不可調整大小的列表?

因為返回一個常規的可調整大小的列表需要在某個時刻復制數組內容......這很昂貴。 (如果實現延遲了復制,直到執行了大小更改操作,原始數組和列表之間的關系將很難理解。想一想......)

b)為什么不使用Collections.unmodifiableList並傳遞java.util.ArrayList對象?

這沒有任何成就。 您仍然必須將數組內容復制到ArrayList 這個“奇怪的”行為規范的重點是避免復制的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM