> 文章列表 > Java 中的 非并发容器

Java 中的 非并发容器

Java 中的 非并发容器

1.四大类容器

java中容器主要有四大类,如下图所示

Java 中的 非并发容器

2.非并发容器

1) List 类

List 类 不支持并发的有 ArrayList 与 LinkedList

ArrayList

底层实现

ArrayList 底层为 数组,由于数组的特性,非常适合用于 查询多,增删改的业务场景

实例化时创建了一个Object类型的数组(Java泛型只存在于编译时期)

Java 中的 非并发容器

扩容

ArrayList 底层为数组,数组一但初始化无法扩容,所以ArrayList底层扩容是通过创建一个新的数组,再将原有数组的数据拷贝过去,拷贝数据底层用的是 System.arraycopy。新数组的大小 = 原有数组的大小 + 原有数组的大小右移一位 近似1.5倍。

Java 中的 非并发容器

Java 中的 非并发容器

创建新的数组后使用 System.arraycopy 数据拷贝

Java 中的 非并发容器

LinkedList

底层实现

LinkedList 底层实现为双向链表,由一个个Node串联起来 ,适合 增删多,查找少的场景(每次查找都需要从头开始遍历,直到找到目标为止)

Java 中的 非并发容器

Node 的三个参数 : 元素,前指针,后指针

Java 中的 非并发容器

扩容

LinkedList 不存在扩容这么一说,如果说LinkedList的上限,那么就是int类型的上限。新增元素时,创建一个新的Node节点,将新节点的prev指针 指向上一个节点,同时将上一个节点的 next指针 指向 新的Node节点

Java 中的 非并发容器

Java 中的 非并发容器

2)Set 类

HashSet

底层实现

HashSet 底层基于HashMap,HashMap 为 k-v 键值对类型,而HashSet 的 value 为 固定值 PRESENT (Object)

Java 中的 非并发容器

扩容

由于HashSet 是在HashMap的基础上实现的,底层对元素的增删改都是对 引用的 HashMap 进行操作,因此扩容机制与HashMap一致

去重

Set 类的集合不能有重复元素,HashSet通过Hash表去重

TreeSet

底层实现

TreeSet 底层维护了 一个 TreeMap,通过Map的 key 来存储元素

Java 中的 非并发容器

扩容

由于TreeSet 是在TreeMap的基础上实现的,底层对元素的增删改都是对 引用的 TreeMap进行操作,因此扩容机制与TreeMap一致