HashMap的实现原理(简要概述)

时间:2025-01-23 07:28:13
HashMap的实现原理(简要概述)

基于哈希算法实现的,它通过put存储,通过get取值.
当传入一个key时,HashMap会根据()计算出哈希值,然后根据这个哈希值将value保存到哈希桶中.

 原理分析:

从结构上来说,HashMap是由数组+链表+红黑树实现的,(最初主要是通过数组存储,链表是为了解决哈希冲突,但是在哈希碰撞次数大于一定的量时,就需要引用红黑树来处理了)源码写在下面


 static class Node<K,V> implements <K,V> {
		//定义数组索引的位置
		final int hash;
		//K,V
		final K key;
		V value;
		//定义下一个链表的节点
		Node<K,V> next;
    Node(int hash, K key, V value, Node<K,V> next) {
         = hash;
         = key;
         = value;
         = next;
    }
	//获取K,V 的值
    public final K getKey()        { return key; }
    public final V getValue()      { return value; }
    public final String toString() { return key + "=" + value; }
	//获取hashCode值
    public final int hashCode() {
        return (key) ^ (value);
    }
	//设置value 
    public final V setValue(V newValue) {
        V oldValue = value;
        value = newValue;
        return oldValue;
    }
	//判断是否相等
    public final boolean equals(Object o) {
        if (o == this)
            return true;
        if (o instanceof ) {
            <?,?> e = (<?,?>)o;
            if ((key, ()) &&
                (value, ()))
                return true;
        }
        return false;
    }
}
--------------------------------------------------------

HashMap是使用哈希表来存储的,为了解决哈希冲突,我们通常采用链地址法,简而言之就是说采用数组加链表的结合,每一个数组元素上都有一个链表结构。通过get获取到数据时,可以获取到数组的下表,然后把数据(value)放到对应下表的链表上。 系统调用这个key的hashCode方法得到hashCode值,然后通过高位和取模运算来定位键值对的存储位置。但是当发生两个key定位到相同位置的时候,就发生了哈希冲突。

 哈希冲突?

哈希表存储数据是通过键值对(key-value)的方式存储的,一个key对应一个value,但是也可能发生特殊情况,可能两个不同的key值在经过哈希运算后得到同样的结果,这样就是哈希冲突(碰撞)。

关于哈希表的初始化长度

哈希表的初始化长度length=16 , 负载因子(LoadFactor)默认值=0.75
threshod = length * LoadFactor (阈值=初始长度*负载因子)
阈值就是允许的最大元素数目,超过这个数目就会重新扩容