![](/img/trans.png)
[英]Whats does new ArrayList<>(Arrays.asList(...)) return?
[英]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。
這樣做的原因很簡單:
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,但是不允許增長數組或縮小數組。
實際上,您可以使用add向ArrayList添加元素。 像這樣的方法:List l2 = new ArrayList(Arrays.asList(array1)); l2.add( “blueCheese”);
-dbednar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.