Java HashMap中get方法的原理

  1. 首先向get()方法中传递一个key

  2. 在get()方法中调用hash(key),如果key!=null,返回该key的哈希值hash = key.hashCode()^ (h >>> 16),否则返回hash=0

  3. 在get()方法中调用getNode(hash,key)方法,获取该key的节点,并返回value

  4. getNode()方法中首先要判断Hashtable是否为空且table长度大于0且该hash值对应的table元素不为空,条件成立则判断该节点的哈希值是否等于hash,依次遍历该链表或红黑树,查找key==node.key?返回查找到的节点的value 

// JDK源码 
public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
}

final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
		//判断hashtable是否为空,key对应的tab[ ]是否为空
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (first = tab[(n - 1) & hash]) != null) {
			//判断第一个节点的hash,key是否相等
            if (first.hash == hash && // always check first node
                ((k = first.key) == key || (key != null && key.equals(k))))
                return first;
			//判断下一个节点是否为空
            if ((e = first.next) != null) {
				//判断是否是红黑树的节点,并遍历查找元素
                if (first instanceof TreeNode)
                    return ((TreeNode<K,V>)first).getTreeNode(hash, key);
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        return e;
                } while ((e = e.next) != null);
            }
        }
        return null;
    }

 

### 回答1: HashMapget方法原理如下: 首先,根据传入的键值计算hash值,然后定位到对应的桶(bucket)中。 如果桶中有对应的Entry对象(键值对),则返回该Entry的值。 如果桶中没有对应的Entry对象,则返回null。 如果桶中有多个Entry对象,则遍历这些Entry对象,找到key值相等的那个Entry对象,然后返回它的值。 ### 回答2: HashMapJava中常用的数据结构之一,它提供了快速查找和访问存储的键值对。get方法HashMap中最基本的方法之一,用于根据键获取对应的值。 HashMap内部使用了一个数组来存储键值对,我们称之为“桶”。当调用get方法时,首先会将传入的键通过哈希函数计算得到一个哈希值。根据这个哈希值,我们可以找到对应的桶的位置。在这个桶中存储的是以链表或红黑树的形式存储的键值对。 接下来,HashMap会遍历这个桶的所有键值对,将传入的键与存储的键进行比较,如果找到了相同的键,则返回对应的值。这里需要注意的是,HashMap使用equals方法来比较键的值是否相等。 对于hashCode相等但不相等的键,HashMap采用了链表或红黑树的形式来存储。当链表长度超过一定阈值(默认为8)时,链表就会转化为红黑树,这样可以提高查找的效率。 在HashMap中,get方法的时间复杂度通常是O(1)的,但在极端情况下可能会达到O(n)。这是因为当哈希值发生冲突时,多个键值对会被存储在同一个桶中,需要遍历这个桶的链表或红黑树来找到对应的键值对。所以,为了减少冲突的概率,我们在设计键时,应尽量使得哈希值分布均匀。 综上所述,HashMapget方法原理就是通过哈希函数计算键的哈希值,然后根据哈希值找到对应的桶,再遍历桶中的键值对,通过比较键的值来找到对应的值。 ### 回答3: HashMapJava中常用的数据结构之一,它是基于哈希表实现的。在HashMap中,get方法用于根据给定的键获取对应的值。 HashMap内部使用一个数组来存储键值对,数组的每个位置称为桶(bucket),每个桶可以存储多个键值对。当我们使用put方法HashMap中添加键值对时,首先会根据键的哈希值决定要存放在数组的哪个位置,然后将键值对存放在对应的桶中。 当调用get方法时,首先会根据给定的键计算哈希值。通过哈希函数,可以将键的哈希值再转化为数组中的索引,从而确定所对应的桶。如果该桶中有多个键值对,则需要进一步比较键的值,找到与给定键相等的键值对。这个比较的过程可能需要遍历桶中的键值对,因此在最坏情况下,时间复杂度为O(n),其中n是桶中键值对的数量。 需要注意的是,当存放在同一个桶中的键值对过多时,会导致桶的链表过长,从而降低了HashMap的性能。为了解决这个问题,当一个桶中的链表长度超过阈值(默认为8)时,会将该链表转换为红黑树,以加快搜索的速度。同样,搜索时也会首先根据键的哈希值确定所在的桶,然后在桶中使用红黑树的搜索算法。 综上所述,HashMapget方法原理是根据键的哈希值找到对应的桶,然后在桶中比较键的值,最终返回与给定键对应的值。在搜索过程中,会利用哈希函数和红黑树搜索算法来提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值