Skip to the content.

首页

version: jdk17


ArrayList

动态数组,非线程安全,支持随机访问(实现了RandomAccess),默认容量10,每次扩容为1.5倍。


LinkedHashMap

继承自HashMap,同时维护了一条双向链表,支持插入顺序或访问顺序,使用的节点类型为内部类Entry,继承自HashMap.Node,增加了before和after指针。


HashSet

通过HashMap实现,Entry的值默认为常量(Object对象)。


LinkedHashSet

继承自HashSet,使用HashSet中专门为其提供的构造方法:

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

EnumMap

使用固定大小为枚举类型中值的个数的数组分开保存枚举键和值,使用枚举值的ordinal确定下标,键不允许为null,但值允许为null。


EnumSet

抽象类,有RegularEnumSet和JumboEnumSet两种内部实现,只能使用静态工厂方法创建对象。每个对象都持有一个包含了全部枚举值且按ordinal排序的数组的引用,该数组被赋予了常量的语义会被所有对象共享。RegularEnumSet和JumboEnumSet都是使用位运算提高效率,将每个long类型变量视作长度64的布尔数组,用来标识枚举值是否存在。枚举类型中值的个数小于等于64时实现为RegularEnumSet,其持有一个long类型变量,size操作实现为调用Long.bitCount()方法;大于64时实现为JumboEnumSet,其持有long类型数组,操作时会统计size。


IdentityHashMap


WeakHashMap

只使用拉链法实现,其Entry类继承自WeakReference,使用WeakReference保存键,当键被GC回收则视作键值对被回收,get、put、resize等操作都会附带移除已被回收键值对。支持空键,使用常量NULL_KEY替换空键,故空键永远不会被回收。


TreeMap

红黑树(2-3-4树),实现NavigableMap接口,非线程安全。如果键非Comparable类型且构造时未指定Comparator,则运行时会抛出ClassCastException(不存在Comparator会直接转换为Comparable),注意是通过Comparable或在Comparator去重,迭代时以中序遍历的方式迭代。

可导航Map接口,继承自SortedMap接口,支持floor(小于等于)、lower(严格小于)、celling(大于等于)、higher(严格大于)。


TreeSet

实现NavigableSet接口,通过TreeMap实现。


Queue


PriorityQueue

无界最小堆,要求元素是Comparable类型或者构造时指定Comparator,否则运行时会抛出转换异常,内部使用了Object数组,默认初始容量11。


Deque[deck]

继承自Queue接口,双向队列,来自Queue的方法语义不变,get方法与element方法语义相同;可作为栈使用,队首作为栈顶,push时容量不足则抛出异常,pop时栈为空则抛出异常。


LinkedList

双向链表,非线程安全,继承自AbstractSequentialList(表示只支持顺序访问),实现了Deque接口。


ArrayDeque

基于数组实现的Deque,非线程安全。可指定初始容量,在不需要扩容的场景下效率更高,因为相比于LinkedList其不需要创建对象。


Arrays


final class ServiceLoader<S> implements Iterable<S>


RandomGenerator

JDK17新增,随机数生成器的公共接口,新增了一系列生成随机数流的方法,以及of(String name)工厂方法(使用SPI的方式加载随机数生成器的实现)。

Random

普通伪随机数生成器,使用当前seed值计算得到新的seed值并更新,因为seed为AtomicLong类型,故在高并发下效率低,不应该再使用

ThreadLocalRandom

线程隔离的伪随机数生成器,为单例模式,不支持设置种子,与ThreadLocal相似,内部是操作当前Thread对象的属性(通过Unsafe)。

使用的Thread属性

静态方法

实例方法

SplittableRandom

可拆分的随机数生成器,用于使用ForkJoinPool和并行流的 场景,通过split方法可以从原实例得到一个新的实例,在流被分割后不同实例之间互不影响。

SecureRandom

强随机数生成器,用于有安全性要求的场景。


Base64

二进制到文本的编码方式,使用大小64的字符表(数字、字母、+和/)将每六位二进制映射为字符序列,在尾部添加=作为填充字符(每个=表示填充了00)。