HashMap源码分析(三)

时间:2022-10-20 11:04:56

HashMap源码分析(三)

???? 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家

???? 擅长领域:全栈工程师、爬虫、ACM算法

???? 公众号:知识浅谈

HashMap源码分析(三)总结 正菜来了⛳⛳⛳

????

????HashMap(int initialCapacity)

含义:这个函数的含义是执行初始容量的HashMap的构造函数,并且使用默认的加载因子,之后调用含有初始值何加载因子的构造函数。

public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

????HashMap()

含义:这个函数的意思是采用无参构造函数,使用默认的容量值和加载因子进行构造函数的创建。

public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

????HashMap(Map<? extends K, ? extends V> m)

含义:构造一个与指定 Map 具有相同映射的新 HashMap。 HashMap 是使用默认加载因子 和足以容纳指定 Map 中的映射的初始容量创建的,函数的最后调用putMapEntries会把传递过来的map对象m中的键值对赋值给新创建的Map对象。

public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}

接着我们继续看putMapEntries这个对象用法。

????putMapEntries()

含义:首先这个函数的主要作用就是相当于啊调用putAll把m对象中的键值对传递给新创建的对象中, 从下方的函数中可以看出先求出传递过来的m的大小,如果大小大于0,再进行下一步,如果s大于阈值threshold,调用resize()初始化或加倍表大小,然后对m这个对象进行遍历,分别把key和value填充到当前对象中。

final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
int s = m.size();
if (s > 0) {
if (table == null) { // pre-size
float ft = ((float)s / loadFactor) + 1.0F;
int t = ((ft < (float)MAXIMUM_CAPACITY) ?
(int)ft : MAXIMUM_CAPACITY);
if (t > threshold)
threshold = tableSizeFor(t);
}
else if (s > threshold)
resize();
for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, evict);
}
}
}

????int size()

含义:这个函数的含义就比较简单了,就是取出map中的size的大小。

public int size() {
return size;
}

????isEmpty()

含义:这个函数的意思是查看对象是不是空,内部判断还是根据size是否为0来判断的。

public boolean isEmpty() {
return size == 0;
}

????get(Object key)

含义:这个就是返回Map中对应的key这个键对应的值,但是内部调用可getNode这个函数获取key对应的value值,第一个参数是key对应的哈希值,第二个参数是这个key,调用这个函数返回对应的节点。

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

上边的函数中调用了getNode()函数,具体的内容下篇文章中具体探究。

????总结

以上是关于HashMap类的相关源码的的一些函数的具体实现,希望有所帮助,Written By ​​知识浅谈​