1. 徒子徒孙报道java
从 Collection家族成员 中能够知道List的徒子徒孙们有(绿色为实现,橙色为继承):数组
AbstractList : SubList : RandomAccessSubList安全
AbstractSequentialList: LinkedListdom
ArrayList性能
Vector : Stackthis
ArrayListspa
LinkedList线程
Vector: Stackcode
问题:从这些关系里很明显发现AbstractList已经实现了List接口,而ArrayList和Vector是继承它的,为何ArrayList和Vector还实现List接口?对象
2. AbstractCollection、AbstractList两个抽象类的功能
AbstractCollection:实现了移除指定元素返回boolean值的功能(依靠迭代器实现的,但此类并未实现迭代器的功能);判断集合包含元素功能;转化成数组的功能。
AbstractList:只实现了迭代器功能,继承AbstractCollection实现的功能。
总结:(1) 这两个抽象类都未实现元素的添加操做,但却定义了各类用到add的方法,算是搭了骨架,只要后面的徒子徒孙们实现add操做,remove操做便可融汇贯通。
(2) 集合的接口和抽象类都未见存储元素的容器(说明这个容器的结构是不肯定的),而是放在具体子类去实现。因此,接口和抽象类都没法去直接作元素的添加和移除功能(由于没有容器)。至于上面所说的移除指定元素返回boolean值得功能则是依靠迭代器的方法实现。
(3) 回到1里面提到的问题:a.抽象类是很低级的,它能够”纸上谈兵“,抽象类就抽了同类的共性,在这里,全部的继承AbstractCollection的集合类,都会涉及到移除指定元素的操做,为了能重复利用经过迭代器去移除元素的代码,因此在顶级抽象类AbstractCollection中实现了,那么它的子类将无需在现实,这是通用功能。b. 至于子类为何还去实现父类的实现的接口,我表示彻底能够不去实现,惟一的好处就是一目了然,知道子类实现了某接口,而不要进入父类里面查看。如果有人发现还有深层妙处,请告知,感激涕零!
3. ArrayList细节
(1) ArrayList的元素容器是数组,经过new ArrayList()建立对象时,数组为空,当有第一个元素添加时,立刻对数组进行扩容,数组长度变成10。建议:如果事先知道集合元素个数,最好的方法是直接使用对象数组或者new ArrayList(count)。若明确知道集合不为空,又不知元素个数,则new ArrayList(10)。固然ArrayList有个收缩的方法:trimToSize(),该方法就是去除数组未使用的位置(相似于字符串去除结尾的空字符String::trim())。
(2) ArrayList的扩容机制: 第一次添加元素时,上面说了,就是扩容到10。以后的扩容是,当前数组大小加上当前数组大小的一半。扩容是要付出代价的,会新建一个数组,将原数组的元素的复制到新数组中。
(3) ArrayList的内存释放: clear()方法,里面遍历数组,将元素置null。
(4) ArrayList实现了序列化接口,可是定义的数组对象是transient,说明它不在序列化以内。
4. Vector 和 Stack细节
(1) Vector的元素容器也是数组, 经过new Vector()建立对象,数组默认大小为10。它能够自定义定义数组的初始大小和扩容大小。
(2) Vector的数组对象是可被序列化的。
(3) Vector的添加、获取、移除元素的方法都加了synchronized。说明Vector操做都是线程安全的,一样这也是耗性能的对象。
(4) Stack 栈对象,后进先出,初始化时,数组为空。
5. LinkedList细节
(1) LinkedList的元素容器的结构:一个链表。下面是链表的节点类的源码。
private static class Node<E> { E item; // 数据 Node<E> next; // 下一个节点 Node<E> prev; // 上一个节点 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
链表结构可以快速的任意位置的插入元素,删除元素,可是链表的元素遍历速度没有数组快(存储结构差别决定,数组是连续的内存,链表是分散的内存,要找到某个元素,那么链表确定比数组复杂,数组只需寄存器++,而链表须要寄存器从新赋值)。
(2) LinkedList虽然实现了序列化接口,可是它里面的成员都不在序列化范围内。