HashMap散列表的相关知识点

目录

1、HashMap的数据结构

2、HashMap中的链表和红黑树有什么区别?

3、HashMap的扩容机制是怎样的?

4、如何在HashMap中根据键获取值?

5、HashMap和HashTable有什么区别?


1、HashMap的数据结构

Hash表是一种基于Hash算法实现的数据结构,它通过将关键字映射到Hash表中的一个位置来访问记录,以加快查找的速度。在Java中,HashMap就是基于Hash表实现的一种数据结构。HashMap底层结构主要由数组和链表(或红黑树)组成。

具体来说,HashMap内部维护了一个Entry数组,每个Entry包含了一个key-value键值对,当我们向HashMap中添加元素时,HashMap会根据key的HashCode值计算出该元素在Entry数组中的位置,如果该位置上已经有元素了,那么就会以链表的形式将新元素添加到该位置的链表末尾,如果链表长度超过了阈值(默认为8),那么就会将链表转化为红黑树,以提高查找效率。当HashMap中的元素数量达到了容量的75%时,就会触发扩容操作,HashMap会重新计算每个元素在新数组中的位置,并将所有元素重新放置到新数组中。

2、HashMap中的链表和红黑树有什么区别?

HashMap中的链表和红黑树都是用来解决哈希冲突的方法,但它们的实现方式不同。当链表长度达到一定阈值时,链表会转换为红黑树,以提高查找效率。具体区别如下:
1. 链表:链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在HashMap中,当哈希冲突发生时,新的元素会被插入到链表的头部,因此链表的顺序是按照插入顺序排列的。链表的查找效率为O(n),其中n为链表长度。
2. 红黑树:红黑树是一种自平衡的二叉查找树,它的查找效率为O(logn),其中n为树的节点数。在HashMap中,当链表长度达到一定阈值时,链表会被转换为红黑树,以提高查找效率。红黑树的节点比链表节点占用更多的空间,因此只有在链表长度较长时才会转换为红黑树。

3、HashMap的扩容机制是怎样的?

HashMap的扩容机制是指在HashMap中存储的元素数量达到一定阈值时,自动增加HashMap的容量,以便能够继续存储更多的元素。具体来说,当HashMap中存储的元素数量超过了负载因子(load factor)与当前容量的乘积时,就会触发扩容操作。默认情况下,负载因子的值为0.75,也就是说,当HashMap中存储的元素数量超过了当前容量的0.75倍时,就会触发扩容操作。

在扩容操作中,HashMap会创建一个新的数组,其容量为原数组的两倍,并将原数组中的所有元素重新分配到新数组中。具体来说,HashMap会遍历原数组中的每个元素,然后根据元素的哈希值和新数组的长度计算出元素在新数组中的位置,并将元素存储到该位置上。由于元素在新数组中的位置可能与在原数组中的位置不同,因此在扩容操作中需要重新计算元素的哈希值和位置。

需要注意的是,由于扩容操作需要重新计算元素的哈希值和位置,因此在扩容操作中可能会导致HashMap的性能下降。为了避免这种情况,可以在创建HashMap时指定初始容量和负载因子,以便在存储元素时就能够避免或减少扩容操作的发生。

4、如何在HashMap中根据键获取值?

在HashMap中,可以使用get()方法根据键获取值。

// 创建一个HashMap对象
Map hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
hashMap.put("orange", 3);

// 根据键获取值
int value = hashMap.get("apple");
System.out.println(value); // 输出:1

另外,如果要遍历HashMap中的所有键值对,可以使用entrySet()方法获取键值对集合,然后使用for循环遍历集合。

// 遍历HashMap中的所有键值对
for (Map.Entry entry : hashMap.entrySet()) {
    String key = entry.getKey();
    int value = entry.getValue();
    System.out.println(key + " : " + value);
}

5、HashMap和HashTable有什么区别?

HashMap和HashTable都是基于哈希表实现键值映射的工具类,但它们之间有以下几个区别:

  1. 线程安全性:HashTable是线程安全的,而HashMap不是。这是因为HashTable的所有公共方法都是同步的,而HashMap没有这个特性。如果需要在多线程环境下使用HashMap,可以考虑使用ConcurrentHashMap。

  2. null键和null值:HashTable不允许null键和null值,而HashMap允许null键和null值。

  3. 继承关系:HashTable是基于Dictionary类的,而HashMap是继承AbstractMap类的。

  4. 初始容量和扩容机制:HashTable的初始容量为11,而HashMap的初始容量为16。HashTable的扩容机制是当哈希表中元素数量超过当前容量的一半时,会重新调整容量为原来的2倍加1;而HashMap的扩容机制是当哈希表中元素数量超过当前容量的75%时,会重新调整容量为原来的2倍。

  5. 性能:由于HashTable是线程安全的,所以在多线程环境下性能会受到影响。而HashMap在单线程环境下性能更好。

参考:

【Java集合】HashMap系列(一)——底层数据结构分析_hashmap底层数据结构-CSDN博客

【精选】HashMap之 链表转红黑树_hashmap转红黑树-CSDN博客

jdk1.8中HashMap底层链表转红黑树的阈值为什么是8?红黑树转链表为什么是6?_hashmap链化和树化阈值为什么是6和8_杨大仙儿..的博客-CSDN博客

【精选】[Java] HashMap是如何实现的?扩容机制是什么?树化机制知道吗?结合源码带你理解HashMap的原理。_javahashmap扩容机制-CSDN博客

java hashmap 获取_java – 如何从HashMap列表中获取值?-CSDN博客

【精选】HashMap和Hashtable的详细区别_hashtable和hashmap的区别详解_IT枫斗者的博客-CSDN博客


你可能感兴趣的:(哈希算法,数据结构,散列表,数据结构)