风也温柔

计算机科学知识库

java hash算法原理 HashMap的实现原理--链表散列

  1. 概述

  是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

  2. 的数据结构

  在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,也不例外。实际上是一个“链表散列”的数据结构,即数组和链表的结合体。这样的结构结合了链表在增删方面的高效和数组在寻址上的优势

  结构:哈希表是由数组+链表组成的,数组的默认长度为16(可以自动变长。在构造的时候也可以指定一个长度),数组里每个元素存储的是一个链表的头结点。而组成链表的结点其实就是内部定义的一个类:。包含三个元素:key,value和指向下一个的next

  3.的存取

  这些元素是按照什么样的规则存储到数组中呢。一般情况是通过[hash]3%(len-1)获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12=12,28=12,108=12,140=12。所以12、28、108以及140都存储在数组下标为12的位置。

  的存储--put:

  <pre> </pre>

  <pre>int hash = key.hashCode(); // 这个hashCode方法这里不详述,只要理解每个key的hash是一个固定的int值
int index = hash %( Entry[].length-1);
table[index] = value;//假定存储链表头结点的数组名为table</pre>

  用table[index]表示通过hash值计算出来的、元素需要存储在数组中的位置。先判断该位置上有没有存有,没有的话就创建一个对象,在该位置上插入,插入结束;如果有的话java hash算法原理,通过链表的遍历方式去逐个遍历,通过方法将key和已有的key进行比较java hash算法原理,看看有没有已经存在的keyjava hash算法原理 HashMap的实现原理--链表散列,有的话用新的value替换老的value;如果没有,则在table[index]插入该,把原来在table[index]位置上的赋值给新的的next,也即,新的插入(put)的位置永远是在链表的最前面,这样插入结束。

  打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:table[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?会这样做:B.next = A,table[0] = B,如果又进来C,index也等于0,那么C.next = B,table[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。

  注:null key总是存放在Entry[]数组的第一个元素。

  扩展:

  按照散列函数的定义,如果两个对象相同,即obj1.(obj2)=true,则它们的必须相同,但如果两个对象不同,则它们的不一定不同。

  如果两个不同对象的相同,就称为冲突。冲突会导致操作哈希表的时间开销增大,所以尽量定义好的()方法,能加快哈希表的操作。覆盖了方法之后一定要覆盖方法,原因很简单,比如, a = new (“abc”); b = new (“abc”);如果不覆盖的话,那么a和b的就会不同,把这两个类当做key存到中的话就 会出现问题,就会和key的唯一性相矛盾。

  的读取--get:

  先定位到数组元素,再遍历该元素处的链表

  <pre>public V get(Object key) {

    if (key == null)
        return getForNullKey();
    int hash = hash(key.hashCode());
    //先定位到数组元素,再遍历该元素处的链表
    for (Entry e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;//显然,在寻找目标元素的时候,除了对比通过key计算出来的hash值,还会用双等或equals方法对key本身来进行比较,两者都为true时才会返回这个元素
    }
    return null;
re>

  文章来源:https://codeantenna.com/a/2IA2g7IP0J