Java集合详解
看了很多文章关于集合的讲解,总算理解各个类之间的联系,简单总结如下几点:
什么是集合?
Java是面向对象的语言,我们在编程的时候自然需要存储对象的容器,数组可以满足这个需求,但是数组初始化时长度是固定的,但是我们往往需要一个长度可变化的容器,因此,集合出现了。
Java集合在java.util包中,这些集合可以看作是容器,用来存储、获取、操纵和传输具有相同性质的多个元素。
现实中的容器主要是添加对象、删除对象、清空对象等。衣柜里面的衣服,可以放入和取出,也可以有序摆放,以便快速的查找,Java集合也是如此,有些是方便插入和删除的,有些是为了方便查找数据。
集合类的继承关系
Collection
接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。
Map
是Java.util
包中的另一个接口,它和Collection
接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value
对。Map不能包含重复的key,但是可以包含相同的value。
Java中常用的集合类有List
集合、Set
集合和Map
集合。其中List
集合和Set
集合继承了Collection
接口(Java5后新增了队列Queue
),List
接口的实现类为ArrayList
,LinkedList
;
Map
接口有两个实现类,HashMap
,HashTable
,如下图:
Collection 接口的接口 对象的集合(单列集合)
│——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-├ Vector 接口实现类 数组, 同步, 线程安全
│———————-└ Stack 是Vector类的实现类
│——-Set 接口: 仅接收一次,不可重复,并做内部排序
│—————-├ HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
│—————- ├ TreeSet 底层实现为二叉树,元素排好序
Map 接口 键值对的集合 (双列集合)
│————Hashtable 接口实现类, 同步, 线程安全
│————HashMap 接口实现类 ,没有同步, 线程不安全
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–├ WeakHashMap
│———––TreeMap 红黑树对所有的key进行排序
│————IdentifyHashMap
总结各集合类之间对比
Arraylist | LinkedList | HashSet | TreeSet | ArrayDeque | PriorityQueue | HashMap | TreeMap | |
---|---|---|---|---|---|---|---|---|
是否有序 | 有序 | 有序 | 无序 | 有序 | 有序 | 有序 | 无序 | 有序 |
存储结构 | 集合 | 集合 | 无集合 | 集合 | 集合 | 集合 | 键值对 | 键值对 |
线程安全 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
元素是否有重复 | 是 | 是 | 否 | 否 | 是 | 是 | 键值唯一,相同覆盖 | 键值唯一,相同覆盖 |
元素是否可为null | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 是 |
底层数据结构 | 数组 | 链表 | 哈希表 | 二叉树 | 循环数组 | 堆 | 哈希表 | 红黑树 |
特点 | 查询快,增删慢 | 查询慢,增删快 | 快速查找 | 快速排序 | 查询快,增删慢 | / | 插入、删除和定位元素快 | 按自然顺序或自定义顺序遍历快 |
数据结构
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
何时使用:
参考资料:
https://thinkwon.blog.csdn.net/article/details/98844796
https://blog.csdn.net/feiyanaffection/article/details/81394745