关于不可变List(由Arrays.asList()创建)

当我们使用java.util.Arrays.asList()从数组创建列表时,列表是不可变的。 我很想知道为什么我们想要创建一个不可变列表,当List (或SetMap )的基本目的是具有动态大小并且能够随意添加,删除元素时。 当我们需要一个固定大小的数据结构时,我们选择Array,当我们需要一个动态数据结构时,我们选择ListSetMap等。那么拥有一个不可变列表的目的是什么? 我在完成任务时遇到了这个问题。

当我们使用java.util.Arrays.asList()从数组创建列表时,列表是可变的。

是和否:可以通过调用修改列表

 list.set(index, element); 

但该列表可能不会结构上进行修改。 这意味着无法向列表中添加元素或从列表中删除元素。 原因很简单,列表仍然由数组支持,并且数组的大小可能不会改变。

当我们需要固定大小的可变集合时,我们选择Array

这是关键点:数组不是 集合 。 Arrays.asList方法主要用作“数组世界”和“集合世界”之间的“桥梁”。

例如, Arrays.asList方法允许您将数据传递给期望Collection的方法:

 // A method that expects a collection: void process(List strings) { ... } void call() { String array[] = new String[] { "A", "B", "C" }; // Pass the array (as a list) to the method: process(Arrays.asList(array)); } 

此应用案例包括从arrays创建其他集合。 例如,如果您有一个数组并且想要创建一个包含数组中元素的Set ,那么您可以这样做

 String array[] = new String[] { "A", "B", "C" }; Set set = new HashSet(); for (String s : array) { set.add(s); } 

但是使用Arrays.asList方法,可以更方便地完成:

 Set set = new HashSet(Arrays.asList(array)); 

Arrays.asList方法可以说是Collection#toArray方法的对应方法,它在相反的方向上工作(虽然这个方法通常涉及创建和填充一个数组,而Arrays.asList方法只是“包装”一个数组和让它“看起来像一个List ”。

这是因为AbstractList类中的add() ,由Arrays java类(内部使用)下的自定义ArrayList(内部静态类)扩展。 请注意,这个add()方法与java.util.ArrayList中定义的方法不同,但是java.util.Arrays$ArrayList

数组具有固定大小的属性,由jvm本机提供。 即使Arrays.copyOf()用于增加的大小,例如Arrays.copyOf(arr, 10); //10 is the length Arrays.copyOf(arr, 10); //10 is the length ,原始数组是arr= int[]{1,2} // size is two 。 它使用System.arraycopy()创建一个新数组 ,最终调用本机方法

[static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)]

请注意,上面的列表只有大小限制,如果你真的想让一个可变列表成为不可变的,请尝试使用Collections.unmodifiableList(mutableList); Immutablility不是jvm定义的概念,而是开发人员的想法。 请参考https://stackoverflow.com/a/42071121/5620851和https://stackoverflow.com/a/42138471/5620851

Interesting Posts