HashMap超详细讲解

HashMap的实现原理是基于哈希表(Hash Table),它通过将键映射到存储桶(Bucket)上来实现快速的存储和检索。具体来说,当我们将键值对放入HashMap中时,HashMap会使用键的哈希码(Hash Code)来计算出一个索引,然后将该键值对存储在对应索引的存储桶中。

下面是HashMap的一些重要概念和操作:
  1. 哈希码(Hash Code):每个对象都有一个默认的哈希码,可以通过对象的hashCode()方法获取。在HashMap中,哈希码被用来计算键在存储桶中的位置。

  2. 存储桶(Bucket):HashMap内部由一个数组实现,这个数组被分成多个存储桶。存储桶是HashMap中存储键值对的地方。

  3. 索引(Index):通过计算键的哈希码得到的一个整数,用来确定键值对在存储桶中的位置。

  4. 冲突(Collision):当两个不同的键计算出相同的哈希码时,产生冲突。HashMap使用链表或红黑树来解决冲突,即将多个键值对存储在同一个存储桶中。

  5. put(key, value):向HashMap中插入一个键值对。首先,计算键的哈希码,然后找到对应的索引,如果该索引没有存储桶,则创建一个新的存储桶。如果存在冲突,根据具体情况使用链表或红黑树进行处理。最后,在存储桶中存储键值对。

  6. get(key):根据键获取对应的值。首先,计算键的哈希码,然后找到对应的索引。如果该索引处没有存储桶,或者存储桶中没有相应的键值对,则返回null。否则,根据键查找相应的值并返回。

  7. remove(key):根据键删除对应的键值对。首先,计算键的哈希码,然后找到对应的索引。如果该索引处没有存储桶,或者存储桶中没有相应的键值对,则不进行任何操作。否则,根据键删除相应的键值对。

HashMap的时间复杂度:
  • 平均情况下,插入(put)、获取(get)和删除(remove)操作的时间复杂度为O(1)。
  • 最坏情况下,如果哈希函数计算得不好,可能导致所有键都散列到同一个存储桶中,此时的时间复杂度为O(n),其中n为键值对的数量。
需要注意的是,HashMap并不是线程安全的,如果在多线程环境下使用,建议使用线程安全的ConcurrentHashMap。
HashMap示例代码:
import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        // 创建一个HashMap对象
        HashMap<String, Integer> hashMap = new HashMap<>();

        // 添加键值对
        hashMap.put("A", 1);
        hashMap.put("B", 2);
        hashMap.put("C", 3);

        // 获取键对应的值
        int valueA = hashMap.get("A");
        System.out.println("Value of A: " + valueA);

        // 删除一个键值对
        hashMap.remove("B");

        // 判断是否包含某个键
        boolean containsKeyC = hashMap.containsKey("C");
        System.out.println("Contains key C: " + containsKeyC);

        // 判断是否包含某个值
        boolean containsValue2 = hashMap.containsValue(2);
        System.out.println("Contains value 2: " + containsValue2);

        // 遍历HashMap
        for (String key : hashMap.keySet()) {
            int value = hashMap.get(key);
            System.out.println("Key: " + key + ", Value: " + value);
        }

        // 清空HashMap
        hashMap.clear();

        // 判断HashMap是否为空
        boolean isEmpty = hashMap.isEmpty();
        System.out.println("HashMap is empty: " + isEmpty);
    }
}

在上面的示例中,我们首先创建了一个HashMap对象,它的键是String类型,值是Integer类型。然后,我们通过put()方法向HashMap中添加了几个键值对。接着,我们使用get()方法获取键对应的值,并使用remove()方法删除了一个键值对。我们还使用containsKey()containsValue()方法来判断是否包含某个键或值。然后,我们使用keySet()方法获取所有的键,并通过遍历键集合来访问键和值。最后,我们使用clear()方法清空了HashMap,并使用isEmpty()方法判断HashMap是否为空。

  • 44
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap是Java中的一个常用的集合类,用于存储键值对的数据结构。它的底层数据结构是数组、链表和红黑树。HashMap可以存储null的键和值。下面是对HashMap源码的详细分析。 1. HashMap的特点:HashMap是无序的,不保证元素的顺序。它允许使用null作为键和值。HashMap不是线程安全的,如果在多线程环境下使用,需要进行额外的同步。 2. HashMap的构造方法: - HashMap():创建一个空的HashMap实例,默认初始容量为16,负载因子为0.75。 - HashMap(int initialCapacity):创建一个指定初始容量的HashMap实例。 - HashMap(int initialCapacity, float loadFactor):创建一个指定初始容量和负载因子的HashMap实例。 - HashMap(Map<? extends K, ? extends V> m):创建一个包含指定Map中所有键值对的HashMap实例。 3. HashMap的成员方法: - put(K key, V value):向HashMap中添加键值对。 - hash方法:计算键的哈希值。 - 扩容方法resize():当HashMap的大小达到阈值时,会自动扩容。 - 删除方法remove():根据键删除对应的键值对。 - 查找元素方法get():根据键获取对应的值。 4. HashMap的常见问题: - HashMap的容量为什么是2的幂次方?这是为了提高哈希函数的散列性能和数组的索引计算效率。 - 为什么负载因子默认是0.75?这是为了在保持较高的查找效率的同时,尽可能减少哈希冲突和扩容次数。 综上所述,HashMap是一种底层使用数组、链表和红黑树的存储方式的键值对集合类,并提供了一系列的方法来操作和查询数据。它的源码实现细节涉及到数组的扩容、哈希函数的计算、链表和红黑树的操作等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [最详细Hashmap源码解析](https://blog.csdn.net/qq_45830276/article/details/126768408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [HashMap源码解析](https://blog.csdn.net/weixin_46129192/article/details/123287837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值