转自:
https://www.cnblogs.com/zcscnn/p/7743507.html、
https://www.cnblogs.com/aisiteru/articles/1151874.html
interface List<E> extends Collection<E>
class ArrayList<E> extends AbstractList<E> implements List<E>
List是接口,ArrayList是类。ArrayList是List接口的一个实现类。
因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指
向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。
List list = new List();//会报错
List list = new ArrayList();//这句创建了一个ArrayList实现类的对象后把它上溯到了List接口。此时它是一个List对象。
ArrayList arrayList = new ArrayList();//这句创建了ArrayList对象
上面的list拥有List的所有属性和方法,但不会拥有其实现类ArrayList的独有的属性和方法。 而arrayList则保留了ArrayList的所有属性和方法,ArrayList继承了List的属性与方法。
arrayList.trimToSize();//trimToSize方法是ArrayList独有的方法
list.trimToSize();//会报错
为什么要用List list = new ArrayList()而不用ArrayList alist = new ArrayList() ?
正因为List是接口,所以它的扩展性是良好的。
List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了: List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.