ArrayList底层操作机制源码分析
1)ArrayList中维护了一个Object类型的数组elementData.
transient Object[ ] elementData;//transient表示瞬间,短暂的,表示该属性不会被序列化
2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为上次的1.5倍。

3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容则直接扩容elementData为原来的1.5倍。



Victor
基本介绍

1)继承了List和Collection类
2)Vector底层也是一个对象数组,protected Object[ ]elementData;
3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
java
public synchronized E get(int index){
if (index >= elementCount);
throw new ArraylndexOutOfBoundsException(index):
return elementData(index);
}
4)在开发中,需要线程同步安全时,考虑使用Vector
Vector和ArryList比较

LinkedList


底层结构
1)LinkedList底层实现了双向链表和双端队列特点
2)可以添加任意元素(元素可以重复),包括null
3)线程不安全,没有实现同步
LinkedList的底层操作机制
1)LinkedList底层维护了一个双向链表
2)LinkedList中维护了两个属性first和last分别指向首节点和尾节点
3)每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表.
4)所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。
一些方法
java
package com.List;
import java.util.LinkedList;
public class LinkedListCRUD {
@SuppressWarnings("all")
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();//底层维护的是一个双向链表
//增
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
//删除
linkedList.remove();//默认删除第一个元素
linkedList.remove(1);//按索引
linkedList.remove("1");//按元素
//改
linkedList.set(1,333);//第一个位置代表index,第二个位置是改成啥
//查
linkedList.get(1);//按索引查找
}
}
ArrayList和LinkedList的比较

如何选择ArrayList和LinkedList
1)如果我们改查的操作多,选择ArrayList
2)如果我们增删的操作多,选择LinkedList
3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择ArrayList
4)在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另外一个模块是LinkedList.