我们为什么需要容器(集合)?
Java编程中我们常与一个非常重要的东西打交道,那就是“数据”。我们可以将数据存在变量里、存在数组里、存在类里,然后进行操作。但仅仅用变量和数组,并不能满足我们对于存储数据的数据结构要求,我们希望有更实用、支持更多数据结构类型的方式存储我们的数据,所有这时,Java提供了容器类,通过Java定义好的容器类,我们可以使用更多结构来存储数据。
其实容器的底层,都是由基本的数组、变量、类等形式做出来的。不同容器的关键,在于它们使用了不同的数据结构思想,如果你有一个更好的数据结构思想,也可以自己定义一个容器出来。
如果你听到有人提到Java集合,那就是说的这些容器。容器 = 集合,翻译的不同而已。
此处,我又又双叒想吐槽这个命名问题了,就喊它的英文不好吗,英文的表述还比翻译准确些。我就曾经在面试字节跳动时,面试官问我对容器的理解,我那时候,只知道它叫集合,所以把容器理解成了Web容器:Tomcat、JBoss、Weblogic等,然后答非所问场面一度尴尬,在我幼小的心灵上留下了巨大的阴影,求我的阴影面积。。。
常用容器分类
我们经常使用的Java提供的容器主要分两类:Collection与Map。
Collection与Map都是一个接口,依靠子孙类来实现,来能实例化使用。
在Collection接口下面,常用的又有List接口,与Set接口。
List接口中的常用实现类有:ArrayList、LinkedList、Vector
Set接口中的常用实现类有:HashSet、TreeSet。
Map接口中常用的实现类有:HashMap、TreeMap。
关于以上接口和实现类的具体介绍,我会每个单独写博客介绍,这里主要进行总结。
我画了一个继承关系图,方便整体了解Java常用容器之间的关系:
常用容器实现类对比
有这么多种实现类,都有其存在的原因。每种容器都有其不同的底层原理,以及优点与缺点,我从以下几个角度对比分析一下:
实现类 | 实现接口 | 底层主要结构 | 特点 |
---|---|---|---|
ArrayList | List(Collection) | 数组 | 有序(存取顺序一致);可重复;查询效率高、增删效率低; |
LinkedList | List(Collection) | 双向链表 | 有序(存取顺序一致);可重复;增删效率高、查询效率低; |
Vector | List(Collection) | 数组 | 同ArrayList,但它是线程安全的synchronized |
TreeSet | Set(Collection) | TreeMap | 无序(存取顺序不同);可以排序(根据值的大小排序);元素不可重复; |
HashSet | Set(Collection) | HashMap | 无序(存取顺序不同);不可排序;元素不可重复; |
TreeMap | Map | 红黑二叉树 | 无序(存取顺序不同);可以排序(根据值的大小排序);Key不可重复,Value可重复; |
HashMap | Map | 数组+单向链表 | 无序(存取顺序不同);不可排序;Key不可重复,Value可重复; |
HashTable | Map | 数组+单向链表 | 同HashMap ,但它是线程安全的synchronized |
每个容器的具体介绍,可以阅读我的如下博客: