关于不可变的列表(由Arrays.asList()创建)

22 浏览
0 Comments

关于不可变的列表(由Arrays.asList()创建)

当我们使用java.util.Arrays.asList()从数组创建一个列表时,该列表是不可变的。我只是好奇为什么我们要创建一个不可变的列表,当List(或SetMap)的基本目的是具有动态大小并能够随意添加、删除元素。当我们需要一个固定大小的数据结构时,我们选择数组,而当我们需要一个动态数据结构时,我们选择ListSetMap等。那么拥有一个不可变的列表有什么目的呢?我在做我的作业时遇到了这个问题。

0
0 Comments

关于不可变列表(由Arrays.asList()创建)的问题是如何产生的以及如何解决的。

在上述代码中,当我们调用`System.out.println(Arrays.asList("a", "b").getClass());`时,运行时类型是`java.util.Arrays$ArrayList`,但是当我们调用`System.out.println(new ArrayList<>(Arrays.asList("a", "b").getClass()));`时,运行时类型却是`java.util.ArrayList`。这种区别可能会有所帮助。

这个问题的原因在于`Arrays.asList()`方法返回的是一个固定大小的列表,该列表是一个由数组支持的列表,而不是`java.util.ArrayList`。因此,它具有`java.util.Arrays$ArrayList`的运行时类型。

解决这个问题的方法是使用`ArrayList`的构造函数创建一个新的`ArrayList`对象,并将`Arrays.asList()`返回的列表作为参数传递进去。通过这种方式,我们可以确保运行时类型是`java.util.ArrayList`。

下面是解决这个问题的代码:

System.out.println(new ArrayList<>(Arrays.asList("a", "b").getClass()));

通过使用`ArrayList`的构造函数,我们可以确保得到一个真正的`ArrayList`对象,而不是一个由数组支持的列表。这样,我们就可以在运行时得到`java.util.ArrayList`作为运行时类型,而不是`java.util.Arrays$ArrayList`。

0
0 Comments

关于不可变列表(由Arrays.asList()创建)的问题,出现的原因是列表由数组支持,数组的大小不能改变,所以列表的大小也不能改变。为了解决这个问题,可以使用new ArrayList(Arrays.asList(array))来创建一个可变的列表。这样做的主要目的是为了将数组和集合进行桥接,方便在两者之间进行转换。虽然列表是可以修改元素的,但不能修改列表的结构,即不能添加或删除元素。这是因为列表仍然由数组支持,数组的大小不能改变。为了解决这个问题,API提供了一个set方法来修改列表的元素,而抛出UnsupportedOperationException来禁用添加元素的操作。

0
0 Comments

在使用java.util.Arrays.asList()方法时,可能会遇到以下问题:返回的List并不是我们期望的java.util.ArrayList,而是Arrays的私有内部类ArrayList,它继承了AbstractList并重写了一些方法的实现。因此,我们不能期望它具有java.util.ArrayList的所有行为。

如果我们查看java.util.AbstractList,可以发现我们可以调用add(E e)方法,但是其他很多方法都不能使用。因此,根据当前的实现,我们只能在列表的底部添加元素,但不能改变列表的结构。

事实上,在使用Arrays.asList()时,我一直以为返回的是java.util.ArrayList,从未意识到它是一个完全不同的类。

0