HashMap put(K key, V value)解析
来源:互联网 发布:梦入神机 知乎 编辑:程序博客网 时间:2024/05/16 09:45
1、HashMap 类结构
/** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;//用来存储Entry final float loadFactor; //负载因子 当数组容量的占用比例超过负载因子时,数组就会扩容。 static class Entry<K,V> implements Map.Entry<K,V> { final K key;//用来存储Key V value;//用来存储Value Entry<K,V> next;//用来指向:相同hashCode的Key,但是不同Key对象 int hash;//Key对象的hashCode值 /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } }}
2、put(K key, V value)代码分析
public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
首先通过int hash = hash(key);计算Key对象的hashCode值。注:hashCode()的默认行为是对在heap上的对象产生独特的值。
然后通过int i = indexFor(hash, table.length);计算该hashCode值存放在entry数组的哪个位置。
然后通过for (Entry<K,V> e = table[i]; e != null; e = e.next)判断该数组位置上的所有Entry对象
(1)若hashCode相同,并且两个Key对象equals,那么就覆盖该key关联的value对象
(2)若hashCode相同,但两个Key对象not equals,那么就执行addEntry(hash, key, value, i);
最后:
void addEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];table[bucketIndex] = new Entry<K,V>(hash, key, value, e);}
(1)首先拿到该数组位置的Entry值e
(2)然后将该entry值e传递给新要添加的Entry值,并使next指向该entry值e,代码如上面的Entry构造方法
Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; }
0 0
- HashMap put(K key, V value)解析
- HashMap.put(K key, V value)源码分析
- TreeMap put(K key,V value)源码分析
- new HashMap(){{put(key, value);}}的解释
- hashMap--put(k,v)源码分析
- 【源码分析】HashMap的put(K k,V v)方法
- HashMap中的put(Object key, Object value)方法实现
- new HashMap().put(key,value)返回值为null,已解决
- HashMap遍历 key value
- HashMap<K, V>泛型类
- HashMap<K, V>泛型类
- HashMap<K, V>泛型类
- HashMap<K, V>泛型类
- HashMap<K,V>详解
- 为什么Java中的HashMap<K, V>的get函数是get(Object key),而不是get(K key)?
- HashMap的put源码解析
- HashMap 根据Value获取Key
- HashMap按key/value排序
- <学习笔记>jsp页面画表格固定列数的方法
- 基于C#开发 Windows Embedded Compact 7 应用
- struts之Action中获取request、response对象的方法
- java 构造函数问题
- gdb提供的功能
- HashMap put(K key, V value)解析
- Wikioi 骑士游历
- VS2008部署问题
- 高通公司AllJoyn推动全球物联网发展--关于AllJoyn
- 基于C#开发 Windows Embedded Compact 7 应用 (下)
- VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题
- Tcl/Tk -- ODBC
- [C++]cpp小笔记3 --- C++数组, 数组指针
- Android开发中常用的跳转系统自带界面方法