HashMap

HashMap

Java中的HashMap是一个基于哈希表的映射接口的实现,它存储键值对,并允许快速检索。以下是HashMap的一些核心知识点总结:

1. 基本概念

  • 键值对HashMap存储数据的形式,每个键(Key)唯一地映射到一个值(Value)。
  • 哈希表HashMap内部使用哈希表来存储数据,哈希表是一个数组,数组的每个元素是一个链表(或树,在Java 8及以上版本中)。

2. 特点

  • 键的唯一性HashMap中的键必须是唯一的,不允许重复。
  • 值的可重复性:值可以重复。
  • 无序性HashMap不保证元素的顺序,且在不同时间可能因哈希碰撞而改变顺序。
  • 线程不安全HashMap不是线程安全的,多线程操作需要外部同步。

3. 构造函数

  • HashMap():默认构造函数,默认初始容量为16,加载因子为0.75。
  • HashMap(int initialCapacity):指定初始容量的构造函数。
  • HashMap(int initialCapacity, float loadFactor):指定初始容量和加载因子的构造函数。

4. 关键方法

  • put(K key, V value):添加或更新键值对。
  • get(Object key):根据键获取值。
  • remove(Object key):根据键删除键值对。
  • containsKey(Object key):检查是否包含指定的键。
  • size():返回HashMap中键值对的数量。
  • isEmpty():检查HashMap是否为空。
  • clear():清空HashMap

5. 哈希函数

  • HashMap使用哈希函数来计算键的哈希码,哈希码决定了键在哈希表中的位置。

6. 加载因子和扩容

  • 加载因子(Load Factor):默认为0.75,表示哈希表填充的程度,当哈希表达到这个比例时,就会进行扩容。
  • 扩容(Resizing):当哈希表的容量达到加载因子所设定的阈值时,HashMap会进行扩容操作,通常是容量翻倍。

7. 碰撞处理

  • 链表法:在Java 7及之前版本中,当哈希碰撞发生时,会使用链表将碰撞的元素串联起来。
  • 红黑树:在Java 8及以上版本中,当链表的长度超过一定阈值(默认为8)时,链表会转换为红黑树,以减少搜索时间。

8. 迭代器

  • HashMap提供了迭代器Iterator来遍历键或键值对。

9. 性能

  • HashMap提供了常数时间复杂度的基本操作,如getput,前提是哈希函数能够合理地分配元素。

10. 注意事项

  • 内存占用HashMap在存储大量元素时会占用较多内存。
  • 键的哈希码:应该合理地覆盖Object类的hashCode()方法,以避免过多的哈希碰撞。
  • 键的等价性:应该正确覆盖equals()方法,以确保键的唯一性。

11. 使用示例

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        System.out.println(map.get("Apple")); // 输出 1

        // 迭代HashMap
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}

二叉搜索树

散列表

HashMap实现原理

HashMap的put过程

HashMap扩容

HashMap多线程死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值