Java容器归纳总结
以JavaGuide为主线参考,结合Oracle官方文档和本人刷题过程中的经验进行的一些总结归纳,如果有疑问或者建议欢迎指出
集合(Collection)
List, Set, Map三者区别:
List: 有序存储数据,可重复(处理有序问题)
Set: 无序存储数据,不可重复 (处理查重问题)
Map: 使用键值对(Key-Value)存储,Key是无序的、不可重复的;Value是无序的、可重复的,每个Key最多映射到一个Value(处理用Key来搜索的问题)p.s. 数组就是一个简单的Map
集合框架底层数据结构
1.List
- ArrayList: 可以动态变化大小的Object数组,使用频率非常高
- Vector: Object数组(与ArrayList基本相同,除了Vector是synchronized而ArrayList是unsynchronized)
- LinkedList: 双向链表 (JDK1.6之前为循环链表,JDK1.7取消了循环)使用频率同样非常高,例如创建队列:
Queue<Integer> queue = new LinkedList<>();
// 创建一个存储int型数据的队列
2.Set
- HashSet:无序,唯一,常用于查重,查某个元素是否已经出现过的问题;底层采用HashMap来保存元素。常用操作有:
// 创建
HashSet<Integer> hs = new HashSet<>();
// 判断target是否存在
hs.contains(target);
// 添加新元素
hs.add(item);
// 删除一个元素
hs.remove(item);
// 返回大小
hs.size();
- LinkedHashSet:该类是HashSet的子类,而且内部是通过LinkedHashMap来实现的。这个容器目前还没有经常碰到,之后再补充。
- TreeSet:有序且唯一,红黑树(自平衡的排序二叉树)
3.Map
- HashMap:JDK1.8之前,HashMap由数组+链表组成,其中数组时HashMap的主体,链表则是为了解决哈希冲突而存在的(拉链法解决哈希冲突)。JDK1.8之后当链表长度大于阈值(默认为8)时,将链表转化为红黑树从而减少搜索时间。
- LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。(目前没怎么用过,之后再总结)
- HashTable:数组+链表组成,数组是HashMap的主体,链表用于解决哈希冲突
- TreeMap:红黑树(目前没用过,之后碰到了再写总结)
如何选用集合?
主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用 Map 接口下的集合,需要排序时选择 TreeMap,不需要排序时就选择 HashMap,需要保证线程安全就选用 ConcurrentHashMap。
当我们只需要存放元素值时,就选择实现Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet,不需要就选择实现 List 接口的比如 ArrayList 或 LinkedList,然后再根据实现这些接口的集合的特点来选用。