Arrays.asList方法将数组转成集合
数组和集合是用于存储对象的容器。它们可以相互转换。数组。aslist方法可用于传输集合。
==Arrays.asList==
可以在通过数组将数组转换为集合后更改集合数吗?Aslist方法?为了解决这个问题,我们直接给出了一些例子。
运行结果:
G
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
...
通过上面的例子,我们可以发现元素的值是通过set()方法修改的,并且原始数组的对应位置的值也被修改了,这表明修改后的值不是问题。然后,通过调用add()方法,直接抛出不支持的operationException异常,这表明无法执行任何操作来修改元素的数量。
那么为什么你不能改变元素的数量呢?输入array.aslist源代码以查看:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
我们发现我们直接创建了一个arraylist对象。根据我们通常对arraylist的理解,我们应该能够修改元素的数量。原来这个数组列表不是我们通常使用的数组列表。它是arraylist,数组的静态内部类。
public class Arrays {
...
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
...
}
...
}
在数组的静态内部类arraylist中,set方法本质上修改数组的值,静态内部类arraylist不实现诸如add、remove和clear等方法。因此,当调用修改元素数的方法时,将引发不支持的OperationException异常。
另一个问题是,在上述情况下,我们通过set方法修改了arraylist集合的第一个元素的值。当我们访问原始数组的第一个位置时,值也发生了更改。为什么?
public class Arrays {
...
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
@Override
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
...
}
@Override
public E get(int index) {
return a[index];
}
@Override
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
@Override
public int indexOf(Object o) {
...
}
@Override
public boolean contains(Object o) {
...
}
@Override
public Spliterator<E> spliterator() {
...
}
@Override
public void forEach(Consumer<? super E> action) {
...
}
@Override
public void replaceAll(UnaryOperator<E> operator) {
...
}
@Override
public void sort(Comparator<? super E> c) {
...
}
}
...
}