数据结构与算法之散列表 链表转红黑树 JDK1.8 优化 原理

数据结构与算法阿木 发布于 2025-07-11 6 次阅读


摘要:

在Java编程语言中,散列表(HashMap)是一种非常重要的数据结构,用于快速查找和存储键值对。随着版本的迭代,JDK1.8对HashMap进行了优化,其中一个显著的改进就是将链表转红黑树。本文将深入探讨这一优化原理,并通过代码实现展示其具体应用。

一、

在Java中,HashMap是基于散列表实现的,它通过散列函数将键映射到数组中的位置。当发生哈希冲突时,HashMap使用链表来存储具有相同哈希值的键值对。当链表长度过长时,查找效率会显著下降。为了解决这个问题,JDK1.8引入了链表转红黑树的优化。

二、链表转红黑树的原理

1. 红黑树简介

红黑树是一种自平衡的二叉搜索树,它通过特定的规则来保证树的平衡,从而确保查找、插入和删除操作的时间复杂度均为O(log n)。

2. 链表转红黑树的触发条件

在JDK1.8中,当链表长度超过8时,HashMap会将链表转换为红黑树。这是因为链表长度超过8时,链表查找的时间复杂度接近O(n),而红黑树查找的时间复杂度接近O(log n),因此转换可以提高效率。

3. 转换过程

当链表长度超过8时,HashMap会创建一个红黑树的节点,并将链表的头节点作为红黑树的根节点。然后,遍历链表,将链表中的节点依次插入到红黑树中。

三、代码实现

以下是一个简单的HashMap实现,其中包含了链表转红黑树的优化。

java

import java.util.LinkedList;


import java.util.List;

class Node {


int key;


int value;


Node next;


boolean isRed;

Node(int key, int value, boolean isRed) {


this.key = key;


this.value = value;


this.isRed = isRed;


}


}

class HashMap {


private static final int THRESHOLD = 8; // 链表转红黑树的阈值


private Node[] table;


private int size;

public HashMap(int capacity) {


table = new Node[capacity];


size = 0;


}

private int hash(int key) {


return key % table.length;


}

public void put(int key, int value) {


int index = hash(key);


Node node = table[index];


if (node == null) {


table[index] = new Node(key, value, true);


size++;


if (size > table.length) {


resize();


}


} else {


if (node.key == key) {


node.value = value;


} else {


List<Node> list = new LinkedList<>();


while (node != null) {


list.add(node);


node = node.next;


}


list.add(new Node(key, value, true));


if (list.size() > THRESHOLD) {


Node root = new Node(list.get(0).key, list.get(0).value, true);


for (int i = 1; i < list.size(); i++) {


root = insert(root, list.get(i));


}


table[index] = root;


} else {


for (Node n : list) {


node = table[index];


while (node.next != null) {


node = node.next;


}


node.next = n;


}


}


}


}


}

private Node insert(Node root, Node node) {


if (root == null) {


return node;


}


if (node.key < root.key) {


root.left = insert(root.left, node);


} else if (node.key > root.key) {


root.right = insert(root.right, node);


} else {


root.value = node.value;


}


return root;


}

private void resize() {


Node[] oldTable = table;


table = new Node[table.length 2];


size = 0;


for (Node node : oldTable) {


while (node != null) {


put(node.key, node.value);


node = node.next;


}


}


}

// 省略其他方法...


}


四、总结

通过以上代码实现,我们可以看到JDK1.8中HashMap的链表转红黑树优化原理。当链表长度超过8时,HashMap会将链表转换为红黑树,从而提高查找效率。这种优化在处理大量数据时尤其有效,可以显著提高程序的性能。

五、展望

随着数据量的不断增长,数据结构的优化变得越来越重要。在未来的Java版本中,我们可以期待更多类似链表转红黑树的优化,以进一步提高HashMap的性能。对于其他数据结构,如跳表、B树等,也可以考虑类似的优化策略。