Java集合
Java集合,主要由两大接口派生出来,Collection(存放单一元素)和Map(存放key-value)键值对。
一、Collection
二、List(有序,可重复)
List的实现方法主要有LinkedList和ArrayList两种。
这两个类的时间复杂度:
如何选择?
1、改查选择ArrayList;
2、增删在尾部的选择ArrayList;
3、其他情况下,时间复杂度一样,推荐ArrayList;
Vector:
Vector 和 ArrayList 一样,也是继承自 java.util.AbstractList,底层也是用数组来实现的。但是已经被弃用了,因为加了很多synchronized关键字。线程安全的条件下就会造成效率低。
ArrayList和Vector的区别主要是:
1、线程安全问题(前者前程不安全,后者线程安全);
2、扩容(前者扩容为原容量的1.5倍,后者为2倍)。
三、Queue & Deque
Queue 是一端进另一端出的线性数据结构;而 Deque 是两端都可以进出的。
①Queue(先进先出)
但PriorityQueue(heap)并不按照进去的时间顺序出来,而是按照规定的优先级出去。
两组api:
选择时:
1、用同组api前后统一;
2、如果需要抛出异常,使用抛出异常的那组。
②Deque
实现类:
- LinkedList
- ArrayDeque
- PriorityQueue
实现普通队列,推荐使用ArrayDeque,因为效率高,而LinkedList还会有其他额外开销。
总结:
- ArrayDeque 是一个可扩容的数组,LinkedList是链表结构;
- ArrayDeque 里不可以存 null 值,但是 LinkedList 可以;
- ArrayDeque 在操作头尾端的增删操作时更高效,但是 LinkedList 只有在当要移除中间某个元素且已经找到了这个元素后的移除才是 O(1) 的;
- ArrayDeque 在内存使用方面更高效。
所以在不是必须要存null值时,推荐选择ArrayDeque(注意:ArrayDeque是Java 6之后才有的)。
③Stack
Stack继承Vector
实现stack定义,就用ArrayDeque吧。
Deque stack = new ArrayDeque<>();
四、Set(无序、不重复)
实现类:
- HashSet:采用 Hashmap 的 key 来储存元素,主要特点是无序的,基本操作都是 O(1) 的时间复杂度,很快。
- LinkedHashSet:这个是一个 HashSet + LinkedList 的结构,特点就是既拥有了 O(1) 的时间复杂度,又能够保留插入的顺序。
- TreeSet:采用红黑树结构,特点是可以有序,可以用自然排序或者自定义比较器来排序;缺点就是查询速度没有 HashSet 快。
每个Set的底层实现其实就是对于的Map
数值放在 map 中的 key 上,value 上放了个 PRESENT,是一个静态的 Object,相当于 place holder,每个 key 都指向这个 object。
参考链接:https://mp.weixin.qq.com/s/bVOSat47L0Hskfx9akAN6Q