专栏首页WriteOnReadJDK集合框架小结

JDK集合框架小结

前面的一些文章主要分析了 Java 集合框架(Java Collections Framework, JCF)中常用的类和接口,本文打算做个整体的小结。

JCF 主要包括 Collection 接口系列和 Map 接口系列,它们的继承结构分别如下:

Collection 接口继承结构:

Map 接口继承结构:

PS: 其中一些类暂未进行分析,有些是因为使用较少(Stack 等),有些打算后面在并发包(java.util.concurrent, JUC)源码分析的时候再进行分析(BlockingQueue、ConcurrentHashMap 等)。

Collection 接口又包括 List、Set 和 Queue 三个子接口,它们的主要特点如下:

1. List: 列表,有序、可重复;

2. Set: 集合(数学中的集合概念),无序、不重复;

3. Queue: 队列,先进先出(First In First Out, FIFO)。

前面分析常用类的小结如下:

ArrayList

1. 「可以自动扩容的数组」,默认初始化容量为 10,默认每次扩容为原容量的 1.5 倍;

2. 扩容时会创建一个新的数组,并将之前的元素拷贝到新数组中(因此,若要将数量已知的元素放入 ArrayList,在初始化时指定长度可以避免多次扩容);

3. 线程不安全,不适合在多线程场景下使用。

Vector

1. 与 ArrayList 类似,Vector 也可以认为是「可变数组」;

2. 扩容原理与 ArrayList 基本一致,只是新容量计算方式略有不同:指定增长容量时,新容量为旧容量 + 增长容量;否则扩容为旧容量的 2 倍;

3. 线程安全,实现方式简单(使用 synchronized);

4. 当前使用较少。

LinkedList

1. 双向链表、双端队列、栈;

2. 线程不安全,内存空间不连续。

至于 HashSet 和 TreeSet,它们的实现分别是基于 HashMap 和 TreeMap,因此不再进行分析。

Map 是以键-值对(Entry)形式存储元素的,HashMap 最为常用,常用类的小结如下:

TreeMap

1. TreeMap 实现了 Map 接口,内部节点类型为 Entry;

2. 基于红黑树实现,具有红黑树的特点;

3. 有序,根据 Entry 的 key 排序;

4. 查找、插入、删除操作的时间复杂度均为 O(logn)

HashMap

1. HashMap 是散列表的实现,它使用“链表法”处理散列冲突用,并在 JDK 1.8 引入红黑树进一步优化;

2. 内部结构为「数组 + 链表 + 红黑树」;

3. 默认初始化容量为 16,负载因子为 0.75,扩容的阈值为 16 * 0.75 = 12;

4. 当容器中元素的容量大于阈值时,HashMap 会自动扩容为原先的 2 倍。

LinkedHashMap

1. 继承自 HashMap,其结构可以理解为「双链表 + 散列表」;

2. 可以维护两种顺序:插入顺序或访问顺序;

3. 可以方便的实现 LRU 缓存;

4. 线程不安全。

Hashtable

1. 散列表的实现,处理散列冲突使用的是链表法,内部结构可以理解为「数组 + 链表」;

2. 默认初始化容量为 11,默认负载因子为 0.75;

3. 线程安全,使用 synchronized 关键字,并发效率低;

4. 若无需保证线程安全,推荐使用 HashMap;若需要线程安全的高并发场景,推荐使用 ConcurrentHashMap。

本文对前面分析的一些集合类做个简单小结,集合类的代码分析暂告一段落,接下来打算分析并发包下常用的类和接口。

有关集合框架可参考官方文档的介绍:

https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html

Stay hungry, stay foolish.

本文分享自微信公众号 - WriteOnRead(WriteOnRead),作者:jaxer

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDK源码分析-CyclicBarrier

    CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。

    WriteOnRead
  • ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波

    ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring。

    WriteOnRead
  • JDK源码分析-Lock&Condition

    涉及多线程问题,往往绕不开「锁」。在 JDK 1.5 之前,Java 通过 synchronized 关键字来实现锁的功能,该方式是语法层面的,由 JVM 实现...

    WriteOnRead
  • [PHP] 2018年终总结

    ========================================================================== 2018年...

    陶士涵
  • JavaScript忍者秘籍

    https://github.com/zhangyue0503/html5js/blob/master/javascriptninja/

    硬核项目经理
  • Python实战(1)模拟wc命令部分功

    1、open(filename) 传入的是变量filename 不要写成open('filename'),不然传入的就是字符串不是变量了

    py3study
  • 采用MEMS优化移动机器人的导航性能

    地面机器人系统通常用于人工介入成本过高、危险过大或者效率过低的任务。在许多情况下,机器人必须能够自主工作,利用导航系统来监视并控制它从一个位置移到另一个位置。管...

    机器人网
  • python根据已有文件名的文件复制文件到新文件夹中

    最近需要对一些图片进行整理,需要从一堆图片中将已经存在在文件中的图片移动到另外一个新的文件夹中,所以就特意就写了一个小玩意方便使用.下面是代码实现:

    小海怪的互联网
  • 前辈点亮生涯路 | 清华大学深圳研究生院袁春老师专访

    ? 职业生涯该如何规划和发展?是成长中的人共有的困惑。尤其对于正在面临人生第一次职业选择的学生来说,未来有太多未知的可能。如何做出正确的选择,无愧于未来?这是...

    腾讯高校合作
  • 浅谈图数据库

    下面这张图是一个社交网络场景,每个用户可以发微博、分享微博或评论他人的微博。这些都是最基本的增删改查,也是大多数研发人员对数据库做的常见操作。而在研发人员的日常...

    NebulaGraph

扫码关注云+社区

领取腾讯云代金券