-相同点:
三者都实现了List接口,存储的特点相同:存储有序、可重复
-不同点:
ArrayList:List接口的主要实现类,线程不安全,效率高,底层用Object[ ]数组存储
LinkedList:对于频繁的插入删除操作,用此类效率较高,底层用双向链表存储
Vector:List接口的古老实现类,线程安全,效率低,底层用Object[ ]数组存储
1、void add(int index, Object ele):在index位置插入ele元素
2、boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
3、Object get(int index):获取指定index位置的元素
4、int indexOf(Object obj):返回obj在集合中首次出现的位置
5、int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
6、Object remove(int index):移除指定index位置的元素,并返回此元素
7、Object set(int index, Object ele):设置指定index位置的元素为ele
8、List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
1、void addFirst(Object obj)
2、void addLast(Object obj)
3、Object getFirst()
4、Object getLast()
5、Object removeFirst()
6、Object removeLast()
底层Object[] elementData初始化为{},空数组。.
第一次调用add()时,底层才创建了长度10的数组。如果此次的添加导致底层elementData数组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
以上是jdk8中的情况。jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了数组的创建,节省了内存。
内部声明了Node类型的first和last属性,默认值为null。
调用add()方法时将数据封装到Node中,创建了Node对象。其中,Node定义为:
- 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;
- }
- }
通过Vector()构造器创建对象时,底层都创建了长度为10的数组。 在扩容方面,默认扩容为原来的数组长度的2倍。