对ArrayList和LinkedList写了个简易的中文注解版本的:https://github.com/jiaojianpeng/list/
ArrayList:
1.底层是数组。
2.查询遍历快。
根据下标进行取值。
3.添加慢。
添加时需要进行扩容,默认数组长度为10,扩容每次扩容1.5倍(扩容计算公式:旧的容量+(旧的容量 >> 1))。
如果知道要添加多少元素,指定集合大小效率会提高。
4.删除慢。
根据下标删除时,需要移动后面的所有元素。通过arraycopy(Object src, int srcPos, Object dest, int destPos,int length);方法来实现移动数据。arraycopy 详情:https://blog.csdn.net/jiao1902676909/article/details/89363608
Vector:
和Arraylist底层实现一样,不过所有的方法都是线程安全的,通过synchronized关键字进行修饰。
扩容机制不同,arrayList每次扩容1.5倍,Vector每次扩容2倍。
LinkedList:
1.底层是双向链表。
2.查询慢。
查询需要根据头节点first或者尾结点last来进行遍历。
计算方式:判断 (下标 < (size >> 1))
如果有30条数据,要查询第14条,那么要从第一条开始查询,一直查询到下标为14的数据。
如果要查询第16条数据。那么要从最后一条进行往前查询,直到查询到下标为16的数据。
3.添加快。
不需要扩容。
4.删除快。
不需要移动数据。只需要把要当前要删除的节点的next指向下一个节点,把要删除的节点的prve指向上一个节点。
如果当前要删除的节点的下一个节点为null,说明是最后一条数据,则把next指向null。
如果当前要删除的节点的上个节点为null,说明是第一条数据,也就是下标为0,则把prve指向null。