- 对比
- 方法
- 访问元素:
- RandomAccess标记接口
- ArrayList
- 1、jdk 7情况下
- 2、 jdk 8中的变化:
- 3、总结:
jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的模汉式,延迟了数组的创建,节省内存。 - LinkedList
- 1、源码分析
LinkedList list = new LinkedList();内部声明了Node类型的first和last属;默认值为10—-list.add(123);将123封装到Node中,创建了Node对象。其中, Node定义为:体现了LinkedList的双向链表的说法 - Vector:线程安全,效率低
对比
List接口:有序的、可重复的数据、”动态”数组
(1)ArrayList: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList: 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector: 底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
方法
常用方法:
- 增:add(E element)
- 删:remove(int Index)/E remove(E element)
- 改:set(int Index,E element)
- 查:get(int Index)
- 插:
**add(int Index,E element)** - 长度:size()
- 遍历:迭代器; for each; 普通循环结构
访问元素:
- 按顺序访问:迭代器:
- 随机访问:get()、set();
RandomAccess标记接口
- 判断集合是否支持随机访问
**List list = new LinkedList();****boolean b = list instanceof RandomAccess;**
ArrayList
1、jdk 7情况下
- ArrayList list = new ArrayList();—-底层创建了长度是10的Object[]数组
- 如果此次的添加导致底层elementData数组容量不够,则扩容默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
- 结论:建议开发中使用带参的构造器: ArrayList List = new ArrayList(int capacity)
2、 jdk 8中的变化:
- ArrayList List = new ArrayList();—-底层object[] elementData初始化为{}
- 第一次调用add()时,底层才创建了长度10的数组,数据添加和扩容操作与jdk7无异。
3、总结:
jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的模汉式,延迟了数组的创建,节省内存。
LinkedList
1、源码分析
LinkedList list = new LinkedList();内部声明了Node类型的first和last属;默认值为10—-list.add(123);将123封装到Node中,创建了Node对象。其中, Node定义为:体现了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;}}
Vector:线程安全,效率低
2、所有方法都是同步的,多线程访问安全;
3、同步操作耗费大量时间
