簡體   English   中英

為什么Arrays.asList()返回自己的ArrayList實現

[英]Why does Arrays.asList() return its own ArrayList implementation

我最近發現在Java中實際上有兩種不同的ArrayList實現(比我猜想的更好......)。

所以我想知道為什么Arrays.asList(T... a)需要返回一個無法調整大小的列表? 如果他們需要一個不可修改的列表,那么為什么要添加set(int index, E element)方法呢?

所以我的一般問題是為什么不從Arrays.asList(T... a)方法返回java.util.ArrayList

您還可以使用java.util.Arrays.ArrayList實現獲得什么?

您詢問:

您還可以使用java.util.Arrays.ArrayList實現獲得什么?

這是因為Arrays.asList返回的Arrays $ ArrayList只是原始數組的一個視圖。 因此,當更改原始數組時,視圖也會更改。

如果使用真實的ArrayList,那么將復制元素,並且對orignal數組的更改不會影響ArrayList。

這樣做的原因很簡單:

  • 表現:無需復制任何內容
  • memory efficent:不需要第二個數組

javadoc說asList返回“由指定數組支持的固定大小的列表”。 如果要調整陣列大小,則必須創建一個新陣列並復制舊數據。 比列表不會由同一個數組實例支持。 所述目標是“此方法充當基於陣列和基於集合的API之間的橋梁。” 因此,對底層數組的直寫是一項設計要求。

它們是兩個具有不同行為的不同類別。

調用Arrays.asList時返回的列表是數組上的瘦包裝,而不是副本。 返回的列表是固定大小:嘗試調用add將拋出UnsupportedOperationException異常。

另一方面, java.util.ArrayList保留了自己的數據內部副本,並且大小可變。

Arrays.asList需要返回一個無法調整大小的列表 - 因為底層數組不能調整大小 - 但這是可修改的 - 因為允許分配給底層數組中的元素。

實際上,您可以使用add向ArrayList添加元素。 像這樣的方法:

List<String> l2= new ArrayList<String>(Arrays.asList(array1));
l2.add("blueCheese");

在我看來,你用它來獲取List的功能,但將它們應用於數組。

兩條評論:

1,嘗試通過調用List接口的remove()方法縮小返回的數組將拋出UnsupportedOperationException。 這是因為Arrays類中的內部ArrayList類擴展了AbstractList,而AbstractList中的remove()方法拋出UnsupportedException。

因此,一旦返回List,您可以在數組中或在返回的List中過載現有元素EITHER,但是不允許增長數組或縮小數組。

  1. 回應:

    實際上,您可以使用add向ArrayList添加元素。 像這樣的方法:List l2 = new ArrayList(Arrays.asList(array1)); l2.add( “blueCheese”);

l2是列表的獨立副本,因此List l2現在與原始數組和List分離。 所以blueCheese在l2中,但不是在彼此備份的原始數組/列表中。

-dbednar

暫無
暫無

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

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