zoukankan      html  css  js  c++  java
  • HashMap 1.8的源码分析一

    public class HashMap<K,V> extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable {
    
        private static final long serialVersionUID = 362498820763181265L;

    首先它是继承了AbstractMap,这个抽象类里面有很多方法,

      从这个可以看出面向对象的特性,单继承,接口的多实现,

      同时实现了序列号接口,可以进行网络传输,在进行网络传输的时候实体类一般都会实现序列号接口,以便传输,

      在整合redis的时候,如果实体没有进行序列化,是无法传输进入到redis中的value上的

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

    这个是进行初始化容量的,

     1 << 4

    这个是位运算: 二进制为 1 向前唯一四位,那么就是10000 那么换成十进制就是2的4次方 就是16,所以hashmap的初始容量为16,

     static final int MAXIMUM_CAPACITY = 1 << 30;

    这个是hashmap的最大容量,表示一个很大的值,大概为2的30次方

      static final float DEFAULT_LOAD_FACTOR = 0.75f;

    这个表示hashmap的装载因子

    static final int TREEIFY_THRESHOLD = 8;

    这个是1.8之后特有的,当链表结构到8时就会变成红黑树,

    static final int UNTREEIFY_THRESHOLD = 6;

    由树变成链表的阀值

    
    
    /**
    * The smallest table capacity for which bins may be treeified.
    * (Otherwise the table is resized if too many nodes in a bin.)
    * Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
    * between resizing and treeification thresholds.
    */
    static final int MIN_TREEIFY_CAPACITY = 64;
     

    当桶中的bin被树化时最小的hash表容量。(如果没有达到这个阈值,即hash表容量小于MIN_TREEIFY_CAPACITY,当桶中bin的数量太多时会执行resize扩容操作)这个MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍。

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

    在HashMap中,为了更好的性能,我们希望作为Key的对象提供一个合理的hash函数以便能将其合理的分配到桶中。     而在实际的HashMap中,对从对象获取的hash值又做了调整,代码过程的直接翻译就是:如果Key值为null,返回0;如果Key值不为空,返回原hash值和原hash值无符号右移16位的值按位异或的结果。

  • 相关阅读:
    dedecms中如何去掉文章页面的广告
    织梦新建顶级栏目打不开,解决办法
    织梦dede模板中广告的去除方法?
    php 转码
    安卓插件
    计时器的实现
    json剥离
    安卓解析json
    安卓 读取网页源码
    java不用jni,也可以获得当前系统性能信息
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10337825.html
Copyright © 2011-2022 走看看