Java源码阅读-HashMap
来源:互联网 发布:网络键盘侠 编辑:程序博客网 时间:2024/06/05 02:33
添加元素
/** * Associates the specified value with the specified key in this map. * If the map previously contained a mapping for the key, the old * value is replaced. * * @param key key with which the specified value is to be associated * @param value value to be associated with the specified key * @return the previous value associated with <tt>key</tt>, or * <tt>null</tt> if there was no mapping for <tt>key</tt>. * (A <tt>null</tt> return can also indicate that the map * previously associated <tt>null</tt> with <tt>key</tt>.) */ public V put(K key, V value) { if (table == EMPTY_TABLE) { // 还未添加过元素,先填充存储键值对的表 inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); // 计算hash值 int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { // 遍历所有桶,如果要插入的key的hash值和桶的hash值相同则插入 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; }
/** * Retrieve object hash code and applies a supplemental hash function to the * result hash, which defends against poor quality hash functions. This is * critical because HashMap uses power-of-two length hash tables, that * otherwise encounter collisions for hashCodes that do not differ * in lower bits. Note: Null keys always map to hash 0, thus index 0. */ final int hash(Object k) { // 计算hash值 int h = hashSeed; if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }
/** * Returns index for hash code h. */ static int indexFor(int h, int length) { // 计算桶的序号 // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2"; return h & (length-1); }
/** * Returns the value to which the specified key is mapped, * or {@code null} if this map contains no mapping for the key. * * <p>More formally, if this map contains a mapping from a key * {@code k} to a value {@code v} such that {@code (key==null ? k==null : * key.equals(k))}, then this method returns {@code v}; otherwise * it returns {@code null}. (There can be at most one such mapping.) * * <p>A return value of {@code null} does not <i>necessarily</i> * indicate that the map contains no mapping for the key; it's also * possible that the map explicitly maps the key to {@code null}. * The {@link #containsKey containsKey} operation may be used to * distinguish these two cases. * * @see #put(Object, Object) */ public V get(Object key) { if (key == null) return getForNullKey(); Entry<K,V> entry = getEntry(key); // 调用私有方法getEntry(key) return null == entry ? null : entry.getValue(); }
/** * Returns the entry associated with the specified key in the * HashMap. Returns null if the HashMap contains no mapping * for the key. */ final Entry<K,V> getEntry(Object key) { if (size == 0) { return null; } int hash = (key == null) ? 0 : hash(key); // 计算查找的key的hash值 for (Entry<K,V> e = table[indexFor(hash, table.length)]; // 遍历桶,如果key的hash值和桶的hash值相同则取出值 e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }
阅读全文
0 0
- Java源码阅读-HashMap
- Java源码阅读-HashMap
- Java源码阅读之HashMap
- Java数据结构 HashMap 源码阅读
- Java源码阅读之HashMap
- Java源码阅读之HashMap
- Java Jdk1.8 HashMap源码阅读
- java集合源码阅读笔记-HashMap
- Java集合源码阅读之HashMap
- hashmap 源码阅读
- HashMap源码阅读
- HashMap源码阅读
- HashMap源码阅读
- HashMap源码阅读笔记
- HashMap源码阅读
- HashMap源码阅读
- HashMap源码阅读
- HashMap源码阅读
- Python3 多线程
- 利用qwtplot3d绘制3维图形
- Java 网络IO编程总结(BIO、NIO、AIO)
- SQL优化(索引)
- UVA 1586
- Java源码阅读-HashMap
- HDU1894 String Compare 字符串比较
- Shell学习笔记
- 高频使用命令
- 最短单源路径之dijkstra算法
- CSU1569 Wet Tiles
- 互斥锁的使用
- Oracle查询语句
- SAN、NAS、SCSI、iSCSI等存储基础知识