1、ArrayList
(1)初始分配长度为:10,每次扩展长度为之前的1.5倍
(2)内部采用动态数组实现
(3)可以随机访问,按照索引位置访问效率非常高,时间复杂度为O(1)
(4)按照内容查找效率比较低,时间复杂度为O(N),N为数组内容长度,性能与数组的长度成正比
(5)插入和删除元素效率比较低,因为需要移动元素,时间复杂度为O(N)
注:适合经常按照索引位置访问且插入与删除操作比较少的场景
2、LinkedList
(1)内部采用双向链表实现
(2)按需分配内存,不需要预先分配
(4)不可以随机访问,按照索引访问效率比较低,时间复杂度为O(N/2)
(5)按照内容查找效率比较低,需要逐个比较,时间复杂度为O(N)
(6)在两端添加与删除的效率非常高,时间复杂度为O(1)
(7)在中间添加与删除效率比较低,因为需要先定位,时间复杂度为O(N)
注1:与ArrayList正好相反,LinkedList 适合添加与删除比较多(尤其是在两端的添加与删除操作),而按照索引位置访问比较少的场景
注2:
队列(Queue)
特点是先进先出,在尾部添加元素,从头部删除元素,主要方法有:
add(E e)、offer(E e) 在尾部添加元素
element()、peek() 查看头部元素,但不改变队列
remove()、poll() 删除头部元素,并且从队列中删除
栈(Stack)
特点是先进后出,主要方法有:
push(E e) 表示入栈,在头部添加元素,栈的空间可能是有限的,如果栈满了,push会抛出异常IllegalStateException。
pop() 表示出栈,返回头部元素,并且从栈中删除,如果栈为空,会抛出异常
peek() 查看栈头部元素,不修改栈,如果栈为空,返回null
双端队列(Deque)
它包含了队列与栈的特性,可以说队列与栈是双端队列的特殊情况,主要方法有:
void addFirst(E e);
void addLast(E e);
E getFirst();
E getLast();
boolean offerFirst(E e);
boolean offerLast(E e);
E peekFirst();
E peekLast();
E pollFirst();
E pollLast();
E removeFirst();
E removeLast();
3、HashMap
(1)内部采用数组链表和哈希的方式进行实现
(2)键不能重复,key和value可以为null值
(3)初始分配大小为16,下次扩展大小与负载因子(loadFactor)有关,loadFactor 默认大小为 0.75,扩展规则为:当键值对个数大于threshold时开始扩展,threshold = 键值对个数 * loadFactor
(4)根据键保存和获取值的效率很高,时间复杂度为O(1)
(5)无序,因为hash值是随机的
注:适合根据键来查找值(查找效率非常高),且不要求顺序的场景
4、HashSet
(1)内部采用HashMap实现
(2)HashSet中存放的值不允许重复,所以HashSet中存放的对象需要重写hashCode和equals方法
(3)存放元素无序
(4)添加、删除、和判断元素是否存在效率都为O(1)
注:可用于排重,集合运算如交集、并集等运算
5、TreeMap
(1)内部采用红黑树实现
(2)TreeMap是按键有序,而不是按值有序
(3)TreeMap中的键对象需要实现Comparable接口,或者在构造器中传入比较器对象Comparator,推荐采用传入比较器的方式,更加灵活
(4)添加、删除、查找效率为O(log2(N)),N为元素个数
注1:需要排序考虑使用TreeMap,否则考虑使用HashMap(如果需要数据有序,考虑使用树结构,不需要排序,则优先使用哈希)
注2:
排序二叉树
(1)有序的树,元素不重复
(2)排序规则:A节点大于A节点的左子树但是小于A节点的右子树
(3)保存、删除、查找的效率为O(h),h为树的高度,如果是平衡的排序二叉树,h为log2(N),N为节点数
红黑树
(1)是一种平衡的排序二叉树
6、TreeSet
(1)HashSet是基于HashMap实现的,元素就是HashMap中的键,值是一个固定的值,TreeSet是类似的,它是基于TreeMap实现的
(2)元素不重复,且有序
(3)添加、删除、查找效率为O(log2(N)),N为元素个数
(4)TreeSet中的键对象需要实现Comparable接口,或者在构造器中传入比较器对象Comparator,推荐采用传入比较器的方式,更加灵活