HashMap源码浅析

Posted kankankankankan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap源码浅析相关的知识,希望对你有一定的参考价值。

HashMap源码主要一些属性

//默认的初始化容量(2的n次方)

static final int default_inital_capacity = 16; 

//最大指定容量为2的30次方

static final int maximum_capacity = 1 << 30;

//默认的加载因子

static final float default_load_factor = 0.75f;

//hashmap的底层结构,entry数组

transient Entry[] table;

//存放的key-value对的个数,决定了数组的扩容,默认16 * 0.75 = 12,当size > 12时,就扩容,而非table中

所占用的桶(table[i])个数来决定是否扩容

transient int size;

 

Entry内部类

 1 static class Entry<K, V> implements Map.Entry<K, V> {
 2         final K key;         
 3         V value;             
 4         Entry<K, V> next;    // 该Entry的下一个Entry(hash冲突时,形成链表)
 5         final int hash;     // 该Entry的hash值
 6 
 7         /**
 8          * Creates new entry.
 9          */
10         Entry(int h, K k, V v, Entry<K, V> n) {
11             value = v;
12             next = n;
13             key = k;
14             hash = h;
15         }
16 
17         public final K getKey() {
18             return key;
19         }
20 
21         public final V getValue() {
22             return value;
23         }
24 
25         //为Entry设置新的value
26         public final V setValue(V newValue) {
27             V oldValue = value;
28             value = newValue;
29             return oldValue;
30         }
31 
32         public final boolean equals(Object o) {
33             if (!(o instanceof Map.Entry))
34                 return false;
35             Map.Entry e = (Map.Entry) o;
36             Object k1 = getKey();
37             Object k2 = e.getKey();
38             //在hashmap中可以存放null键和null值
39             if (k1 == k2 || (k1 != null && k1.equals(k2))) {
40                 Object v1 = getValue();
41                 Object v2 = e.getValue();
42                 if (v1 == v2 || (v1 != null && v1.equals(v2)))
43                     return true;
44             }
45             return false;
46         }
47 
48         public final int hashCode() {
49             return (key == null ? 0 : key.hashCode())^(value == null ? 0 : value.hashCode());
50         }
51 
52         public final String toString() {
53             return getKey() + "=" + getValue();
54         }
55     }

 

以上是关于HashMap源码浅析的主要内容,如果未能解决你的问题,请参考以下文章

HashMap源码浅析

hashMap底层源码浅析

HashMap源码浅析

HashMap源码阅读笔记——HashMap的实现原理浅析

1.7和1.8 HashMap 源码浅析

ConcurrentHashMap 源码浅析 1.7