Java集合框架知多少?
在Java 功法中, 为了简化对各种数据结构的使用,封装成了各种各样的集合框架.
1. Java集合框架知多少?
Java集合框架大致可分为四种类型: List,Map,Set, Queue.
接下来详细说说这几个集合框架的特点.
1.1 List -----数组和链表
List 是一个接口,是对数据结构中数组和链表的封装.
该接口的实现类常用的有两种,ArrayList 和LinkedList.
1.1.1 ArrayList or LinkedList?
那么这两个实现类有什么区别呢?
请看下图对比可知:
ArrayList | LinkedList |
---|---|
快速随机访问快 | 快速随机访问慢 |
插入删除慢 | 插入删除快 |
多线程并发场景下使用下不安全 | 多线程并发场景下使用不安全 |
底层使用数组实现 | 底层使用链表实现 |
数组方式存储单个元素的顺序表结构 | 链表方式存储单个元素的链表结构 |
1.2 Map --------Key Value 哈希结构
- Map 也是一个接口,是存储KV键值对的哈希式结构.
- 特点是Key,Value 方式存储
- Key 不可重复,按照哈希函数计算得到的唯一值,
- Value是可重复的
- 获取所有的key 用keySet()方法
- 获取所有的Value用values();方法
- 获取所有的Key和Value用entrySet()方法
1.2.1 HashMap or ConcurrentHashMap?
HashMap | ConcurrentHashMap |
---|---|
适用于单线程场景下使用 | 适用于多线程并发场景下使用 |
注:
HashTable 因为性能瓶颈已淘汰被废弃
1.3 Set
- Set 是不允许出现重复元素的集合类型.
- 最常用的实现类有: HashSet ,TreeSet, LinkedHashSet.
1.3.1 HashSet or TreeSet or LinkedHashSet?
1.3.2 HashSet
HashSet底层基础其实是使用HashMap 实现,怎么理解呢?
我们先来看下源码中这个方法
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
我们可以看到当HashSet()被初始化的时候,创建了一个HashMap 对象, 当我们执行Set中的add(E e);
方法的时候会把Object 对象作为Key , 而Value始终是维护的一个不变的对象.
1.3.3 TreeSet
TreeSet底层基础使用TreeMap实现,而TreeMap 的底层是数据结构树的封装.
在添加新元素到集合中时,按照某种比较规则将其插入合适的位置,保证插入后得集合仍然是有序的.
1.3.4 LinkedHashset
LinkedHashset 继承自Hashset, 具有HashSet 的优点,内部使用链表维护了元素的插入顺序.
1.4 Queue
- Queue 也是一个接口,是数据结构中队列的封装
- 队列的特性是先进先出
- 队列是一种特殊的线性表
- 该接口常见的实现类有:
- BlockingQueue
这节主要侧重于理论,下篇讲解实战中这些集合应该如何使用.