zoukankan      html  css  js  c++  java
  • HashMap底层源码分析

    源码分析

    *static final int* *DEFAULT_INITIAL_CAPACITY*** = 1 << 4; // aka 16 表示1向左移4位,2的4次方**
    **static final int* *MAXIMUM_CAPACITY** = 1 << 30;//hashmap数组的最大容量

    *static final float* *DEFAULT_LOAD_FACTOR*** = 0.75f;//默认加载因子,当集合的容量大于75%的时候,就进行扩容

    *static final int* *TREEIFY_THRESHOLD*** = 8;//jdk1.8,当链表长度大于8的时候,就调整成红黑树

    *static final int* *UNTREEIFY_THRESHOLD*** = 6;//jdk1.8 当链表长度小于6时,调整成链表

    *static final int* *MIN_TREEIFY_CAPACITY*** = 64;//jdk1.8 当链表长度大于8时,并且集合元素个数大于等于64

    *transient* Node<K,V>[] *table*;//hash表中的数组

    *transient int* *size*;//元素个数

    总结:

    (1)hashmap刚刚创建时候,table是null,为了节省空间,当添加第一个元素的时候,table容量调整为16.

    (2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍,目的是减少调整元素的个数。

    (3)Jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64的时候,会调整为红黑树,目的是提高执行效率

    (4)Jdk1.8 当链表长度小于6时,会调整成链表

    (5)Jdk1.8以前,链表时头插法,jdk1.8以后时是尾插入。

    Hashset的底层是hashmap

    Map集合的实现类

    HashMap[重点]:

      Jdk1.2版本,线程不安全,运行效率快;允许用null,作为key或是value。

    Hashtable:

      Jdk1.0版本,线程安全,运行效率慢;不允许null作为key或是value。基本上在实际项目开发过程中这个类是不用的。

    Propertise:继承自HashTable

      Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。

    TreeMap:

      实现了SortedMap接口(是Map的子接口),可以对key自动排序。

    TreeSet底层的实现原理使用的就是TreeMap

  • 相关阅读:
    [转自老马的文章]用MODI OCR 21种语言
    [转老马的文章]MODI中的OCR模块
    贴片晶振的脚位方向如何区分
    晶振简介及如何使用示波器测试晶振
    Lintcode 150.买卖股票的最佳时机 II
    Lintcode 82.落单的数
    Lintcode 97.二叉树的最大深度
    Lintcode 9.Fizz Buzz 问题
    LeetCode之461. Hamming Distance
    NYOJ之题目325 zb的生日
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/14349934.html
Copyright © 2011-2022 走看看