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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容