LinkedListz在jdk8中的源码解析:
LinkedList list= new LinkedList<>();//底层也没做啥
list.add(“AA”);将"AA"封装到一个Node对象1中,list对象的属性first,las都指向此Node对象1。
list.add("BB"); //将"BB"封装到一个Node对象2中,对象1和对象2构成一个双向链表,同时last指向此Node对象2
...
因为LinkedList使用的是双向链表,不需要考虑扩容问题。
LinkedList内部声明:
transient int size = 0;//长度
/**
* Pointer to first node.
*/
transient Node<E> first;//定义的头部节点
/**
* Pointer to last node.
*/
transient Node<E> last;//定义的尾部节点
private static class Node{
E item;
Node next;
Node prev;
}
3.LinkedList是否存在扩容问题?NO!
四,启示与开发建议
1.Vector基本不使用了
2.ArrayList底层使用数组结构,查找与添加(尾部添加)操作效率高,时间复杂度为O(1)
删除和插入操作效率低,时间复杂度为O(1)
LinkedList底层使用双向链表结构,删除和插入操作效率高,时间复杂度为O(1)
查找与添加(尾部添加)操作效率高,时间复杂度为O(n)(有可能添加操作时O(1))
-
在选择了ArrayList的前提下,new ArrayList():底层创建长度为10的数组
new ArrayList(int capacity):底层创建指定capacity长度的数组。
如果开发中,大体确认数组的长度,则推荐使用ArrayList(int capacity)这个构造器,避免了数组扩容的问题。