假如这个时候有一个数组要求将数组转换成list类型的,那么问题来了:转换后的list类型中能使用什么方法呢?
实例代码:
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{1,2,3});
System.out.println(list);
list.add(5);
System.out.println(list.size());
list.remove(1);
System.out.println(list.size());
list.get(3);
}
先来猜猜,是不是都会正常输出,没有异常情况?如果是这样的话那就大错特错了,结果如下:
UnsupportedOperationException:是不支持的操作异常,也就是说,上面的几种方法有一种以上是不能正常操作的,那一个个排除
实例代码:
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{1,2,3});
System.out.println(list);
list.add(5);
// System.out.println(list.size());
// list.remove(1);
// System.out.println(list.size());
// list.get(3);
结果:
实例代码:
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{1,2,3});
System.out.println(list);
// list.add(5);
System.out.println(list.size());
// list.remove(1);
// System.out.println(list.size());
// System.out.println(list.get(2));
}
结果:
实例代码:
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{1,2,3});
System.out.println(list);
// list.add(5);
System.out.println(list.size());
list.remove(1);
// System.out.println(list.size());
// System.out.println(list.get(2));
}
结果:
实例代码:
public static void main(String[] args) {
List list = Arrays.asList(new Integer[]{1,2,3});
System.out.println(list);
// list.add(5);
System.out.println(list.size());
// list.remove(1);
// System.out.println(list.size());
System.out.println(list.get(2));
}
结果:
总结:只有get()方法和size()方法是可以正常使用的,其余的方法都不可以正常使用,那为什么呢?这就不得不查看底层代码了
当程序运行到
Listlist = Arrays.asList(new Integer[]{1,2,3});
调用的是Arrays类中的asList()方法:
public staticList asList(T... a) { return new ArrayList<>(a); }
这里又调用Arrays类中的构造方法,
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
在Arrays类中存在有ArrayList的静态内部类:
private static class ArrayListextends AbstractList 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[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class extends T[]>) a.getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return 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) { E[] a = this.a; if (o == null) { for (int i = 0; i < a.length; i++) if (a[i] == null) return i; } else { for (int i = 0; i < a.length; i++) if (o.equals(a[i])) return i; } return -1; } @Override public boolean contains(Object o) { return indexOf(o) != -1; } @Override public Spliterator spliterator() { return Spliterators.spliterator(a, Spliterator.ORDERED); } @Override public void forEach(Consumer super E> action) { Objects.requireNonNull(action); for (E e : a) { action.accept(e); } } @Override public void replaceAll(UnaryOperator operator) { Objects.requireNonNull(operator); E[] a = this.a; for (int i = 0; i < a.length; i++) { a[i] = operator.apply(a[i]); } } @Override public void sort(Comparator super E> c) { Arrays.sort(a, c); } }
从这里不难看出,当程序调用Arrays类的内部类ArrayList的构造方法并返回一个list类型时,就只能使用ArrayList类中的方法了,除此之外不可以使用其他的方法。可以使用的方法有构造方法,toArray()方法,get()和set()方法,indexOf,contains,spliterator,forEach,replaceAll,sort和size()等方法。



