JAVA基础-集合
Collection
Collection
- List
- ArrayList
- LinkedList
- Vector(了解,已过时)
- Set
- HashSet
- LinkedHashSet
- TreeSet
- HashSet
Map
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- Hashtable(了解,,已过时)
List集合
ArrayList
有序的集合,底层是数组,非同步。ArrayList的访问速度是要比LinkedList要快的,对于删除和修改而言消耗是比较大(复制和移动数组实现),LinkedList是双向链表删除和修改只需要修改对应的指针即可,消耗是很小的
Vector
Vector是同步的,有序的集合,底层是数组
LinkedList
LinkedList是双向链表,插入、删除和修改一般效率要高于ArrayList,但是也要看场景,LinkedList的遍历速度是要慢于ArrayList的复制移动速度的,如果数据量有百万级的时,还是ArrayList要快。
SET
Set具有和Collection完全一样的接口,不像List。Set和List最大的区别在于,Set是唯一的、无序的。“唯一的”表示Set不保存重复的原色,“无序的”表示Set中元素的存储是没有顺序的,不过如果真想要保持元素的顺序可以用TreeSet。所以对于Set,最常被使用的简单应用就是测试归属性,即判断某个元素是不是在Set集合里。
对于Set,一般最常使用的就是HashSet,它专门对快速查找操作进行了优化。因为它的底层数据结构为散列表(即哈希表),有关散列的内容,我会在另外一篇文章中详细介绍。
Queue
通常情况下,LinkedList可以被用作Queue的一种实现,因为它实现了Queue的接口。不过还有一个类,叫PriorityQueue,它是一个比较标准的队列实现类,但不是绝对标准。因为PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek()、pull()方法来取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。这其实违背了先进先出(FIFO)规则。
Map
HashMap
HashMap的是根据键的HashCode值来存储数据,数据的存储是无序的,其底层数据结构在Java 1.8后为数组+链表+红黑树, HashMap允许key和value都为null,key不允许重复,线程不安全。
Hashtable
不允许key和value为null。是个线程安全的Map(已过时,数据增加到一定程度的时候,效率太低)
LinkedHashMap
LinkedHashMap保存了元素插入Map时的顺序,
TreeMap
TreeMap实现了SortMap接口,所以它可以根据键进行排序。它默认的排序规则是升序排序
ConcurrentHashMap
ConcurrentHashMap 就是线程安全的 map,其中利用了锁分段的思想提高了并发度。锁的时候不锁整个hash表,而是只锁一部分,默认允许16条线程同时操作。