关于不可变的列表(由Arrays.asList()创建)
关于不可变列表(由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`。
在使用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
,从未意识到它是一个完全不同的类。