zoukankan      html  css  js  c++  java
  • 《Java基础知识》Java Hash底层原理

    前言

    了解到JDK8对HashMap进行了优化,就一起了解一下JDK8的HashMap。

    原理

    1. 哈希表的原理

    首先需要一张Hash表,Java通过数据实现:默认长度位16,并且。

    第一步插入张三(哈希值11):

    第二步插入李四(哈希值12):

    第三步插入李磊(哈希值12):

    从上图我们基本可以看出Java HashMap的存储原理。

    2. JDK8在什么情况会将链表转化成红黑树?

    上图中如果12这个位置的数据存放太多了,超过8个,这个时候Java 就会将链表转化成红黑树,(这个要注意如果数组长度低于64是不会转红黑树的)。

    红黑想要了解的同学转:https://www.cnblogs.com/jssj/p/13873485.html

    3. Hash 不可能一直是16 这么长,那什么时候扩容呢,Java代码中写了当存入数据超过hash表长度的3/4 就会扩容扩容的逻辑为翻倍。

    即:16 --> 32 --> 64 -- 128 这样。

     hash表扩容所有已经存的值的hsah值都需要重新计数,再放入新的hash表中, 这个操作比较消耗性能,所以这里存在一个优化点。

    如果我们知道map需要被使用的长度是多少,可以在创建HashMap的时候知道长度:

    Map hashMap = new HashMap(64);

    总结

    1. JDK8 Hash表有自动扩容的功能。 扩容会重新将节点放入新的hash表中。

    2. 底层数据结构:JDK8为 数组+链表+红黑树,之前为数组+链表。

    3. JDK8中链表在长度超过8并且数组大于64的时候,自动由链表转成红黑树。

    4. Hash表在元素大于3/4 长度的时候进行Hash表扩容(每次翻倍)。

    5. HashMap是线程不安全的,如果需要线程安全可以使用ConcurrentHashMap。

  • 相关阅读:
    TX1/TX2 Qt安装与配置
    Gsteramer 环境配置
    NVIDIA Jetson TX2刷机
    TX2之多线程读取视频及深度学习推理
    搭建USB摄像头转RTSP服务器的多种方法
    TX2 五种功耗模式
    NVIDIA TX1/TX2 对比
    tf.reduce_mean
    关闭tensorflow运行时的警告信息
    sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
  • 原文地址:https://www.cnblogs.com/jssj/p/13875638.html
Copyright © 2011-2022 走看看