您的位置:首页 > 其它

关于HashMap的一些讨论

2017-11-16 15:26 218 查看

HashMap是我们经常用的一个类,也是面试中经常会到的问题,所以分享一些HashMap的一些内容。

重点:put,get,resize扩容

先贴出一些我参考的文章:

1. http://blog.csdn.net/fyxxq/article/details/42066843

2. http://blog.csdn.net/hxpjava1/article/details/55670439

3. https://www.cnblogs.com/hongdada/p/6024832.html

下面是我的一些总结:

public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
// 根据hash值找到插入的数组下标
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
// 当下标相同并且key equals也相同时,就将当前的value替换
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
// 在下标为i的数组中加入这个Entry
addEntry(hash, key, value, i);
return null;
}

public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
// 根据hash值找到这个数组下标
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
// 下标一样并且key equals也一样,则返回这个value
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
// 否则没有值返回
return null;
}

其中putForNullKey方法表示key为null的Entry,只保存在table[0]中的第一个链表中,取也是取table[0]的链表的第一个节点。

private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
// 取出下标为0的链表,如果当前key为null,则替换当前值
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
// 将null添加到下标为0的链表中的第一个节点
addEntry(0, null, value, 0);
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: