美文网首页
HashMap相关

HashMap相关

作者: hhxx2yd | 来源:发表于2018-04-24 13:52 被阅读0次
hashCode.png

hash概念

hash:是一种信息摘要算法,它还叫做哈希,或者散列。我们平时使用的MD5中的公私钥验证都属于Hash算法,通过输入key进行Hash计算,就可以获取key的HashCode(),比如我们通过校验MD5来验证文件的完整性。

碰撞:好的Hash算法可以计算出几乎独一无二的hashCode,如果hashCode出现了重复的,就称作碰撞。

hashCode

  • hashCode是object对象方法,一般对象都会重写该方法;
  • hashMap允许key为null,但是只能存在一个null的key;
  • hashMap什么时候会用到equals方法?

HashMap存储过程

HashMap是将数组和链表结合的一种结构,比较形象如下图:


HashMap.png

首先进行put操作时,会先计算出该key的hash值,然后调用HashMap的hash方法,该方法在JDK 8中如下:

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

主要思想是将key的高16位和低16进行与或操作,然后再通过下面与操作,计算出数key在数组中的索引位置,算法的目的主要是为了让数据尽可能的分布均匀:

 h & (length-1)

后面再根据数组对应索引中是否有数据然后进行数据的添加,这其中判断key是否重复的依据是有key的equals方法来进行的,如果equals方法相同,则认为key重复,只会对value进行更新。

HashMap扩容

随着不断往HashMap存放数据,需要进行扩容操作,代码中主要通过如下:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

static final float DEFAULT_LOAD_FACTOR = 0.75f;

默认数组大小16,当超过16 * 0.75时会进行resize扩容操作,这个过程会重写进行hash计算,性能消耗比较大,因此选择一个好的初始容量非常重要

HashMap遍历

    Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();
  while (iter.hasNext()) {
      Map.Entry entry = (Map.Entry) iter.next();
      Object key = entry.getKey();
      Object val = entry.getValue();
  }

HashTable和HashMap

  1. Hashtable线程安全,HashMap线程安全;
  2. 建议使用ConcurrentHashMap;

JDK8中HashMap的新特性

如果某个桶中的链表记录过大的话(当前是TREEIFY_THRESHOLD = 8),就会把这个链动态变成红黑二叉树,使查询最差复杂度由O(N)变成了O(logN)。

for (int binCount = 0; ; ++binCount) {
    if ((e = p.next) == null) {
        p.next = newNode(hash, key, value, null);
        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
            treeifyBin(tab, hash);
        break;
    }
    if (e.hash == hash &&
        ((k = e.key) == key || (key != null && key.equals(k))))
        break;
    p = e;
}

Set List Map

Collection
----set
--------ArrayList / LinkedList / Vector
----List
--------HashSet / TreeSet

Map
----HashMap
--------LinkedHashMap
----HashTable
----TreeMap

其他问题

  • 在Android中使用SparseArray代替HashMap
  • Android中LruCache实现原理就是通过LinkedHashMap来实现的
  • LinkedHashMap原理是将HashMap和双向链表进行结合来实现的

参考文章

  1. https://blog.csdn.net/justloveyou_/article/details/62893086
  2. http://www.importnew.com/21294.html

相关文章

  • HashMap相关

    HashMap容量为2次幂的原因 hash方法可以计算一个对象的hashcode,我们不用过于关注 但是他计算ha...

  • HashMap相关

    HashMap是数组+链表 1.HashMap不是线程安全,为什么不是线程安全的呢? 多线程put,多线程reha...

  • HashMap相关

    HashMap、LinkedHashMap、ConcurrentHashMap、ArrayMap、SparseMa...

  • HashMap相关

    hash概念 hash:是一种信息摘要算法,它还叫做哈希,或者散列。我们平时使用的MD5中的公私钥验证都属于Has...

  • HashMap相关

    https://www.jianshu.com/p/45fa4e80b631HashMap与HashTable都实...

  • HashMap相关

    HashMap的底层实现原理,get的过程发生了什么 HashMap是用来存储key-value键值对的集合,每一...

  • ConcurrentHashMap原理分析

    相关的HashMap java里面有HashMap、HashTable 和 ConcurrentHashMap。其...

  • JDK1.8中HashMap底层实现原理

    接下来会从以下几个方面介绍 HashMap 源码相关知识: 1、HashMap 存储结构 2、HashMap 各常...

  • hashmap相关问题

    概述 java8对java7中hashmap的实现进行了一部分修改,最大的修改在于利用了红黑树,jdk7使用数组+...

  • java源码分析之HashMap(三)

    相关文章java源码分析之HashMap(一)java源码分析之HashMap(二)https://blog.cs...

网友评论

      本文标题:HashMap相关

      本文链接:https://www.haomeiwen.com/subject/rzydlftx.html