图解Java 集合类核心知识全面回顾

01、背景介绍

在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。

  • Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set 代表无序、不可重复的集合;Java 5 又增加了 Queue 体系集合,代表队列集合。
  • Map:则代表具有映射关系的键值对集合。

很多书籍将 List、Set、Queue、Map 等能存放元素的接口体系,也归纳为容器,因为他们可以存放元素!

集合和容器,这两者只是在概念上定义不同,比如ArrayList是一个存放数组的对象,真正用起来并不会去关心这个东西到底是集合还是容器,把东西用好才是关键!

java.util.Collection下的接口和继承类关系简易结构图:

图片

图片

java.util.Map下的接口和继承类关系简易结构图:

图片

需要注意的是,网上有些集合架构图将 Map 画成继承自 Collection,实际上 Map 并没有继承 Collection,Map 是单独的一个集合体系,这点需要纠正一下。

图片

在 Java 集合框架中,数据结构和算法可以说在里面体现的淋淋尽致,这一点可以从我们之前对各个集合类的分析就可以看的出来,如动态数组、链表、红黑树、Set、Map、队列、栈、堆等,基本上只要出去面试,集合框架的话题一定不会少!

下面我们就一起来看看各大数据结构的具体实现!

02、List

List 集合的特点:存取有序,可以存储重复的元素,可以用下标进行元素的操作。

List 集合中,各个类继承结构图:

图片

图片从图中可以看出,List 主要实现类有:ArrayList、LinkedList、Vector、Stack。

2.1、ArrayList

ArrayList 是一个动态数组结构,支持随机存取,在指定的位置插入、删除效率低(因为要移动数组元素);如果内部数组容量不足则自动扩容,扩容系数为原来的1.5倍,因此当数组很大时,效率较低。

图片

当然,插入删除也不是效率非常低,在某些场景下,比如尾部插入、删除,因为不需要移动数组元素,所以效率也很高哦!

ArrayList 是一个非线程安全的类,在多线程环境下使用迭代器遍历元素时,会报错,抛ConcurrentModificationException异常!

因此,如果想要在多线程环境下使用 ArrayList,建议直接使用并发包中的CopyOnWriteArrayList!

2.2、LinkedList

LinkedList 是一个双向链表结构,在任意位置插入、删除都很方便,但是不支持随机取值,每次都只能从一端开始遍历,直到找到查询的对象,然后返回;不过,它不像 ArrayList 那样需要进行内存拷贝,因此相对来说效率较高,但是因为存在额外的前驱和后继节点指针,因此占用的内存比 ArrayList 多一些。

图片

图片

LinkedList 底层通过双向链表实现,通过first和last引用分别指向链表的第一个和最后一个元素,注意这里没有所谓的哑元(某个参数如果在子程序或函数中没有用到,那就被称为哑元),当链表为空的时候first和last都指向null。

2.3、Vector

Vector 也是一个动态数组结构,一个元老级别的类,早在 jdk1.1 就引入进来了,之后在 jdk1.2 里引进 ArrayList,ArrayList 可以说是 Vector 的一个迷你版,ArrayList 大部分的方法和 Vector 比较相似!

两者不同的是,Vector 中的方法都加了synchronized,保证操作是线程安全的,但是效率低,而 ArrayList 所有的操作都是非线程安全的,执行效率高,但不安全!

对于 Vector,虽然可以在多线程环境下使用,但是在迭代遍历元素的时候依然会报错,抛ConcurrentModificationException异常!

在 JDK 中 Vector 已经属于过时的类,官方不建议在程序中采用,如果想要在多线程环境下使用 Vector,建议直接使用并发包中的CopyOnWriteArrayList!

2.4、Stack

Stack 是 Vector 的一个子类,本质也是一个动态数组结构,不同的是,它的数据结构是先进后出,取名叫栈!

不过,关于 Java 中 Stack 类,有很多的质疑声,栈更适合用队列结构来实现,这使得 Stack 在设计上不严谨,因此,官方推荐使用 Deque 下的类来是实现栈!

2.5、小结

List 接口各个实现类性能比较,如图:

图片

  • ArrayList(动态数组结构),查询快(随意访问或顺序访问),增删慢,但在末尾插入删除,速度与LinkedList相差无几,但是是非线程安全的!
  • LinkedList(双向链表结构),查询慢,增删快,也是非线程安全的!
  • Vector(动态数组结构),因为方法加了同步锁,相比 ArrayList 执行都慢,基本不在使用,如果需要在多线程下使用,推荐使用并发容器中的CopyOnWriteArrayList来操作,效率高!
  • Stack(栈结构)继承于Vector,数据是先进
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔向理想的星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值