Java 8 HashMap
2020-12-13 15:37
标签:initial cat for ide 存在 位操作 方法 code load HashMap 使用数组、链表和红黑树存储键值对,当链表足够长时,会转换为红黑树。HashMap 是非线程安全的。 HashMap 中的容量用到了移位操作,将一个数 a 左移 n 位相当于:a = a * 2n ,所以 1 1 * 24 = 16 。因此,HashMap 的容量总是 2 的 n 次幂。 使用有参构造方法可以指定初始容量和装填因子,指定的容量会被向上调整为 2 的 n 次幂(比如给定容量为13,则会调整为 16)。 HashMap 中键值对的值可以为 null,可以存在一个 key 为 null 的键值对。 在调用 这里的 (n - 1) & hash 就是求余操作,相当于 hash % n,因为 HashMap 的长度总是 2 的 n 次幂。 该方法接受一个 lambda 表达式,将满足给定条件的值替换掉,比如: 该方法也接受一个 lambda 表达式,用于消费键值对: Java 8 HashMap 标签:initial cat for ide 存在 位操作 方法 code load 原文地址:https://www.cnblogs.com/cloudfloating/p/11612899.htmlHashMap 中的常量
static final int DEFAULT_INITIAL_CAPACITY = 1
DEFAULT_INITIAL_CAPACITY
初始容量为 16。MAXIMUM_CAPACITY
最大容量为 230 。DEFAULT_LOAD_FACTOR
默认装填因子。初始情况下,当键值对数量大于 16 * 装填因子时,就会扩容为原来的 2 倍。TREEIFY_THRESHOLD
当链表的长度达到该值时,有可能会转化为树。UNTREEIFY_THRESHOLD
当链表长度小于该值时,会从树退化为链表。MIN_TREEIFY_CAPACITY
在转变为树前,会做一次判断,只有键值对的数量大于该值时,才会转化为红黑树,若小于该值,只触发扩容。
HashMap 的部分方法
treeifyBin 方法
/**
* Replaces all linked nodes in bin at index for given hash unless
* table is too small, in which case resizes instead.
*/
final void treeifyBin(Node
put
方法添加键值对时,如果数量达到了 TREEIFY_THRESHOLD
,就会调用 treeifyBin
方法,该方法会再判断一次表长度是否达到 MIN_TREEIFY_CAPACITY
,如果没有达到,就只做扩容操作,否则将表转化为树。replaceAll 方法
@Override
public void replaceAll(BiFunction super K, ? super V, ? extends V> function) {
Node
HashMap
forEach 方法
@Override
public void forEach(BiConsumer super K, ? super V> action) {
Node
// 打印所有键值对
map.forEach(
(k, v) -> System.out.println(k + ": " + v)
);
// 打印所有 key 为偶数的键值对
map.forEach(
(k, v) -> {
if (k % 2 == 0)
System.out.println(k + ": " + v)
}
);
上一篇:linux线程操作
下一篇:scala 对一个数组分组操作