`
bcyx163
  • 浏览: 5304 次
文章分类
社区版块
存档分类
最新评论

HashMap容量增长源码分析

    博客分类:
  • Java
 
阅读更多
   HashMap其实是通过一个线性数字Entry保存值的,默认构造方法的容量大小为16,当要添加值进去,容量到了当前容量的75%时,Entry容量会扩大一倍,以下是部分关键源码:
    static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认负载系数
    static final int DEFAULT_INITIAL_CAPACITY = 16;//默认为16

    //无参构造方法
    public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);//threshold 默认为12,当size超过threshold时,Entry数组会增大一倍
        table = new Entry[DEFAULT_INITIAL_CAPACITY];//Entry数组默认大小为16
        init();
    }

    //往HashMap中put一个值
    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);//这里添加一个entry
        return null;
    }

    //添加一个Entry
    void addEntry(int hash, K key, V value, int bucketIndex) {
	Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
        if (size++ >= threshold)//当size超过threshold时,Entry数组会增大一倍
            //Entry数组容量扩大一倍,并且threshold=新的Entry数组容量*负载系数
            resize(2 * table.length);
    }
分享到:
评论

相关推荐

    易语言HashMap类源码-易语言

    通过分析源码,我们可以学习如何在易语言环境中实现高效的哈希表,这对于优化程序性能、解决实际问题有着重要的价值。此外,理解源码也有助于我们自定义和扩展数据结构,以适应特定的应用场景。

    HashMap的实现原理

    然而,随着冲突次数的增加,链表的增长会导致性能下降,这时可能需要调整 HashMap 的容量或者负载因子。 总之,HashMap 作为一种高效的键值对存储结构,在 Java 应用程序中有着广泛的应用。其核心思想是利用哈希...

    20-集合框架020-HashMap-1080P 高清-AVC20

    在Java编程语言中,集合框架是一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理各种数据存储...这个高清视频可能包含了HashMap的实例演示、源码分析以及常见问题解答,有助于深入理解和应用HashMap。

    03_ListAndSet_java_order64n_源码

    本文将深入探讨这两种数据结构的实现原理,并通过源码分析来加强理解。 首先,我们来看看List接口。List是有序的集合,允许元素重复,并且可以按索引访问。在Java中,ArrayList和LinkedList是List接口的主要实现类...

    java8集合源码分析-blog:博客

    对于集合的源码分析,我们可以关注几个核心类,如ArrayList、HashMap和LinkedList。ArrayList是一个动态数组,它的增删改查操作在不同的位置有不同的性能表现。在Java 8中,为了提高性能,ArrayList在容量不足时会...

    Map+List+ArrayList+LinkedList Java源码

    **源码分析** 深入研究这些类的源码,可以帮助我们理解它们是如何在内存中组织数据以及如何执行各种操作的。例如,`HashMap`的哈希函数如何计算元素的桶位置,`ArrayList`如何调整其容量,以及`LinkedList`如何通过...

    java.util.Collection源码分析与深度理解

    4. Vector类曾经是ArrayList的替代品,但现在已经被ArrayList取代,因为Vector的所有方法都是同步的,这会导致性能下降,而且其扩容策略(每次增长一倍)相比ArrayList(增长50%)更消耗内存。 5. HashSet是Set接口...

    集合框架的总结

    以`ArrayList`为例,其内部使用动态增长的数组存储元素,当添加元素超过数组容量时,会自动扩容。`HashSet`的核心是`HashMap`,每个元素的键值就是元素本身,值为`null`。`HashMap`通过哈希算法确定元素的位置,快速...

    java集合源码-javaSE-:集合源码剖析

    在"java集合源码-javaSE-:集合源码剖析"这个主题中,我们将深入探讨Java集合框架的内部实现,包括ArrayList、LinkedList、HashMap、HashSet等常见集合类的源码分析。 1. **ArrayList**: ArrayList是基于动态数组...

    深入学习java源码-Java-Collection-Framework:java集合框架详解,这里有集合框架的深入学习并且贴出了部分重要

    Java集合框架是Java编程语言中的一个核心特性,它为数据存储和操作提供了丰富的类库。在深入学习Java源码时,理解并掌握Java...在实践中不断探索,结合开源系统的源码分析,将使你对Java集合框架有更全面和深入的认识。

    深入分析Android系统中SparseArray的

    以下是对其源码的深入分析。 首先,SparseArray是一个实现了Cloneable接口的类,其内部维护了两个数组:`mKeys`用于存储键(int类型),`mValues`用于存储值(Object类型)。`mSize`变量表示当前存储的键值对数量。...

    JAVA数据结构

    ### 四、案例分析——基于JDK源码探究经典算法实现 #### 4.1 ArrayList扩容机制 当ArrayList容器内部存储的实际元素数量超过预设容量时,会自动触发扩容过程。具体而言,ArrayList采用了默认增长比例为1.5倍的方式...

    高级C语言 学完C语言来看这个绝对收获

    - **验证输入长度**:确保不会超过缓冲区的容量。 #### 23. C语言高效编程秘籍 提高C程序效率的技巧包括: - **循环优化**:减少循环内的计算量。 - **使用位运算**:利用位运算代替乘法和除法操作。 #### 24. C...

Global site tag (gtag.js) - Google Analytics