FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  • List
  • ArrayList
  • LinkedList
  • CopyOnWriteArrayList
  • Vector
  • Stack
  • Set
  • HashSet
  • LinkedHashSet
  • TreeSet
  • CopyOnWriteArraySet
  • Map
  • HashMap
  • LinkedHashMap
  • TreeMap
  • HashTable
  • ConcurrentHashMap
  • WeakHashMap
  • Queue
  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • ConcurrentLinkedQueue
  1. Java
  2. JDK

集合概览

最后更新于1年前

List

ArrayList

  • 内部使用 Object[] 保存元素

  • 实现了 RandomAccess 接口

  • 新扩容的数组长度 = 旧数组长度 + 旧数组长度 / 2

  • 查询元素 O(1),插入元素 O(n)

  • 源码走读请见

LinkedList

  • 使用双向链表保存内部元素

  • 实现了 Deque 接口

  • 查询元素 O(n),插入元素 O(1)

  • 源码走读请见

CopyOnWriteArrayList

  • 内部使用 Object[] 保存元素

  • 使用 volatile 修饰 Object[]:保证查询元素的可见性

  • 实现了 RandomAccess 接口

  • 使用 ReentrantLock 同步:修改元素时会锁定,查询元素时不会锁定

Vector

  • 内部使用 Object[] 保存元素

  • 实现了 RandomAccess 接口

  • 使用 synchronized 同步:对内部元素的所有操作都会锁定

Stack

  • 继承 Vector

  • 实现 LIFO 操作:Last In,First Out

Set

HashSet

  • 基于 HashMap 实现,Key 是 Set 集合元素,Value 是 new Object() 对象

  • 不能保证顺序

LinkedHashSet

  • 基于 LinkedHashMap 实现,Key 是 Set 集合元素,Value 是 new Object() 对象

  • 可以保证插入顺序

TreeSet

  • 基于 TreeMap 实现

  • 支持排序操作

CopyOnWriteArraySet

  • 基于 CopyOnWriteArrayList 实现

Map

HashMap

  • 内部使用节点数组 + 链表/红黑树保存元素

  • 使用 (table.lenth - 1) & (hashCode ^ (hashCode >>> 16)) 计算元素在数组内的下标位置

  • 当链表长度大于 8 的时候,JDK8 中会将链表优化为红黑树

LinkedHashMap

  • 基于 HashMap 实现,继承重写 HashMap.Node 类为 双向链表

  • 可以保证插入顺序

TreeMap

  • 基于红黑树算法实现

  • 支持排序操作

红黑树是一种自平衡的二叉查找树,性质如下:

  1. 节点是红色或者黑色

  2. 根节点是黑色

  3. 每个叶子节点都是黑色

  4. 每个红色节点必须连接两个黑色子节点

  5. 任意节点到它的叶子节点的所有路径都包含相同数目的黑色节点

HashTable

  • 内部使用节点数组 + 链表保存元素

  • 使用 (hash & 0x7FFFFFFF) % tab.length 计算元素在数组内的下标位置

  • 不允许 key == null

  • 使用 synchronized 同步:对内部元素的所有操作都会锁定

ConcurrentHashMap

  • 内部的数据结构和算法和 HashMap 类似:使用节点数组 + 链表/红黑树保存元素,使用 (table.lenth - 1) & hashCode 计算元素在数组内的下标位置

  • 使用 CAS 同步节点数组,使用 synchronized 同步链表/红黑树:添加元素时会锁定,读取元素时不会锁定

WeakHashMap

  • 内部使用 WeakReference 节点数组 + 链表保存元素

  • 使用 (table.lenth - 1) & hashCode 计算元素在数组内的下标位置

Queue

ArrayBlockingQueue

  • 有界阻塞队列,基于数组实现

  • 内部使用 ReentrantLock 和 Condition 实现阻塞逻辑

LinkedBlockingQueue

  • 无界阻塞队列,基于链表实现

  • 内部使用 ReentrantLock 和 Condition 实现阻塞逻辑

ConcurrentLinkedQueue

  • 无届非阻塞队列,基于链表实现

  • 使用 CAS 修改链表节点

源码走读请见

源码走读请见

源码走读请见

Gist
Gist
Gist
Gist
Gist