0
点赞
收藏
分享

微信扫一扫

HashMap底层实现原理

Silence潇湘夜雨 2022-04-17 阅读 40
java
在JDK7版本中:
HashMap<String, Object> hashMap = new HashMap<>();
实例化以后,底层创建了长度为16的一位数组Entry[] table;经过多次put添加元素之后,map.put(key1, value1);首先调用key1所在类的hashCode()方法获得key1的哈希值,此哈希值经过指定算法计算以后得到该数据在Entry[]数组中的存放位置。
情况一:如果此位置上数据为空,此时之间添加key1-value1,添加成功。
情况二:如果此位置上的数据不为空,表明此位置存在一个或多个数据(以链表形式存储),比较key1与已存在的一个或多个数据的哈希值,如果key1与已存在的一个或多个数据的哈希值都不同,则直接添加key1-value1。添加成功。
情况三:如果key1的哈希值与已经存在的某个数据(key2-value2)的哈希值相同,则继续比较,调用key1所在类的equals(key2),如果返回false,直接添加key1-value1,添加成功,如果返回true,则用value1值替换value2。
关于情况二和情况三:此时key1-value1和原来的数据以链表的形式存储。
扩容情况:默认扩容为原来的两倍,并将原有的数据复制到新的数组中。
在JDK8版本中:
在new HashMap<>()时,底层没有创建一个长度为16的数组,只有在第一次添加数据时,才创建长度为16的数组。
public HashMap() {
  this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
底层的数组为Node[],而非Entry[]。
jdk7底层结构:数组+链表。jdk8底层结构:数组+链表+红黑树。
当数组的某一位置上的数组以链表存储的数据>8并且当前数组长度>64时,此时此索引上的数据改为红黑树存储。
LinkedHashMap底层实现原理:底层比HashMap多出了两个引用:Entry<K, V> before, after;能够标记此数据的前一个数据和后一个数据,记录数据的添加顺序,输出元素时,可以根据添加的顺序输出。
HashSet底层也用的是HashMap,将数据存储在HashMap的key中,value都为同一个静态的Object()对象。
源代码如下:
  public HashSet() {
    map = new HashMap<>();
  }
	//添加元素
  public boolean add(E e) {
    return map.put(e, PRESENT)==null;
  }
  private static final Object PRESENT = new Object();


举报

相关推荐

0 条评论