HashMap实现原理及源码分析

1、数据结构

     在数据结构算法中,给我们介绍了常用的几种数据结构:数组,链表,哈希表。

     数组结构:其在内存分配是一段连续的内存空间,可能会占用内存空间严重,空间复杂度很大,时间复杂度小,其优点是易于寻址,但是插入、删除困难。

     链表结构:其在内存分配是一系列离散的内存空间,占用内存少,空间复杂度很小,时间复杂度很大,其优点是易于插入和删除,寻址困难。

     哈希表:哈希表是集合数组和链表的存储结构,满足寻址方便,易于操作,占用内存空间较小,时间复杂度有较小。其例如下:

         

       已知一组数据{19,14,23,01,68,20,84,27,55,11,10,79},按照哈希函数H(key)= key MOD 13和链表地址法处理哈希冲突,其哈希表如下:

    上述是一个长度为13的数组,每个元素存储的是一个链表的头结点,用过Hash函数hash(key)%len获取索引位置。

2、HashMap的定义

     HashMap的内部是按哈希表实现:

                 


    其定义源码如下(JDK1.8中对HashMap进行了很大的修改):

    定义数组,存储Node节点。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;"/** 
  2.      * The table, initialized on first use, and resized as 
  3.      * necessary. When allocated, length is always a power of two. 
  4.      * (We also tolerate length zero in some operations to allow 
  5.      * bootstrapping mechanics that are currently not needed.) 
  6.      */  
  7.     transient Node<K,V>[] table;</span>  

Node节点实现Map.Entry接口,包含key,value,next,hash值。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">/** 
  2.      * Basic hash bin node, used for most entries.  (See below for 
  3.      * TreeNode subclass, and in LinkedHashMap for its Entry subclass.) 
  4.      */  
  5.     static class Node<K,V> implements Map.Entry<K,V> {  
  6.         final int hash;  
  7.         final K key;  
  8.         V value;  
  9.         Node<K,V> next;  
  10.   
  11.         Node(int hash, K key, V value, Node<K,V> next) {  
  12.             this.hash = hash;  
  13.             this.key = key;  
  14.             this.value = value;  
  15.             this.next = next;  
  16.         }  
  17.   
  18.         public final K getKey()        { return key; }  
  19.         public final V getValue()      { return value; }  
  20.         public final String toString() { return key + "=" + value; }  
  21.   
  22.         public final int hashCode() {  
  23.             return Objects.hashCode(key) ^ Objects.hashCode(value);  
  24.         }  
  25.   
  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 == this)  
  34.                 return true;  
  35.             if (o instanceof Map.Entry) {  
  36.                 Map.Entry<?,?> e = (Map.Entry<?,?>)o;  
  37.                 if (Objects.equals(key, e.getKey()) &&  
  38.                     Objects.equals(value, e.getValue()))  
  39.                     return true;  
  40.             }  
  41.             return false;  
  42.         }  
  43.     }</span>  

其中Map.Entry接口如下:



3、HashMap的关键属性

    HashMap的最主要的连个属性是默认初始大小和加载因子。

    DEFAULT_LOAD_FACTOR = 0.75f;  //默认table大小

    DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16  当大于默认大小时,调整大小增量


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值