看API,我们知道,这个方法会返回一个固定长度的List。有下面几个问题:
这个list是什么样子的;
从Array 变为List,JVM是怎么做到的;
这个List为啥不能增加、删除;
jdk为啥要用静态内部类,不用接口的方式去实现这个功能。
这个list是什么样子的;
从Array 变为List,JVM是怎么做到的;
这个List为啥不能增加、删除;
jdk为啥要用静态内部类,不用接口的方式去实现这个功能。
先来看源码,源码中去掉了本文不用的方法。
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
上面的方法调用下面的静态内部类
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
public E get(int index) {
return a[index];
}
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
}
1、我们可以看到,返回的List是一个ArrayList类型的对象,这个ArrayList类并不是Java.util.ArrayList类,而是Arrays类的静态内部类。
2、这个静态内部类继承了AbstractList类,并且AbstractList<E> extends AbstractCollection<E> implements List<E>。
3、AbstractList里面的add()方法和remove方法只是做了简单的定义,并没有去实现;且ArrayList 也没有实现这两个方法。
4、如果用多态的方式,会增加很多不必要的代码量。而用内部类可以实现c++中多重继承的功效。
第一次写文章,肯定有不少疏漏和理解不对的地方,大神们,如果觉得哪个地方说的不对或者你有很好的提议,还望您留下宝贵意见,共同进步。