`
RepublicW
  • 浏览: 83160 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

HashMap的初始容量(initialCapacity)和装载因子(loadFactor)

阅读更多
按HashMap源码里的那种重构方法,如果reHash过多,显然会影响性能。所以为了防止过多的reHash,我们需要自己配置HashMap的装载因子loadFactor和初始的table容量capacity的大小(可以在构造函数里配或者调用方法配)。

很容易理解,如果我们已经知道我们使用的HashMap一般情况的存储在1W对以上,你给它一个默认的16的初始的table容量,默认reHash每次容量翻倍,这得重构多少次呀!(如果装载因子为1,还得要约5~6次)。但是如果我们的对HashMap的容量需求不是很大,你给它一个默认1W的容量,显然又浪费宝贵的空间了。至于这两个参数的选择可以自己去把握,甚至可以设定动态绑定:分析历史数据,找出规律,或者预测未来的走向找出规律。对HashMap这两个参数实现一个动态的调整。比如早上8点~9点A业务比较忙,它对应的HashMap可以提前多给些空间,而10点以后B业务使用的HashMap比较忙,A相对清闲,可以缩减A的空间给B。

如果从数据库的表中读取记录存入HashMap中,完全可以根据记录的行数(row size)来初始化HashMap的容量,这样就可以达到reHash的最少次数,同时也保证了HashMap所需的最小容量:

比如:通过SQL语句: select count(字段) as rowSize from 表

提到行数: rowSize = 30

那么我们在定义HashMap的时候:  HashMap<String,String> h = new HashMap<String,String>(rowSize,1f);



下面是HashMap的相关源代码部分:
_____________________________________________

//HashMap的构造

public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);

        // Find a power of 2 >= initialCapacity
        int capacity = 1;
        while (capacity < initialCapacity)
            capacity <<= 1;

        this.loadFactor = loadFactor;
        threshold = (int)(capacity * loadFactor);
        table = new Entry[capacity];       
       
        init();
    }

 

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);
        return null;
    }

 

//添加新的项目
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相等时,就将当前的容量扩大一倍
        {         
         resize(2 * table.length);
        }
    }

 

//重构大小
void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);
    }
分享到:
评论
2 楼 RepublicW 2012-06-25  
大海lb 写道
楼主,我最近也在看jdk的一些源码,昨天看了hashmap,那个重构大小?是指什么?

就是你map的大小
1 楼 大海lb 2011-12-22  
楼主,我最近也在看jdk的一些源码,昨天看了hashmap,那个重构大小?是指什么?

相关推荐

    HashMap源码分析

    3. **指定初始容量和加载因子的构造函数** `HashMap(int initialCapacity, float loadFactor)`:创建一个具有指定初始容量和加载因子的空`HashMap`。 4. **基于另一个映射创建的构造函数** `HashMap(Map, ? extends...

    java提高篇(二三)-----HashMap.pdf

    3. HashMap(int initialCapacity, float loadFactor):创建指定初始容量和自定义加载因子的HashMap。 初始容量是指HashMap创建时分配的数组大小,而加载因子则定义了在扩容前HashMap可以达到的填充程度。当HashMap...

    java中hashmap容量的初始化实现

    HashMap有多个构造函数,但我们主要关心的是`HashMap(int initialCapacity)`,它允许我们指定HashMap的初始容量。在默认的情况下,HashMap的容量是16。但是,如果我们通过构造函数指定了一个数字作为容量,那么...

    hashmap实现原理

    在Java中,HashMap的初始化涉及两个重要属性:initialCapacity(初始容量)和loadFactor(负载因子)。initialCapacity定义了HashMap的初始大小,而loadFactor定义了在何时进行扩容的阈值。默认情况下,...

    文件以及字符操作部分方法.txt

    上午: Map 集合 key-value key 无序无重复 value 无序可重复 ...HashMap(int initalCapacity,float loadFactor)具有指定的初始容量和负载因子 HashMap(Map,?extends V&gt; m)HashMap与指定相同的映射 Map 4.常用方法

    java在hashmap初始化时赋初值过程解析

    Java 在 HashMap 初始化时赋初值过程解析 ...本文介绍了 Java 中的 HashMap 初始化时赋初值过程解析,包括使用双括号进行初始化的语法和可能导致的串行化失败的问题,以及解决办法。希望对大家的学习有所帮助。

    Java中HashMap详解(通俗易懂).doc

    - 选择合适的初始容量(initialCapacity)和负载因子,以优化HashMap的性能。初始容量越大,扩容次数越少,但内存占用也会增加。 - 注意HashMap的并发问题,如果在多线程环境下,使用Collections.synchronizedMap()...

    HashMap,HashTable,ConcurrentHashMap之关联.docx

    HashMap 的初始化阶段有三个常量:DEFAULT_INITIAL_CAPACITY(初始容量)、MAXIMUM_CAPACITY(最大容量)和 DEFAULT_LOAD_FACTOR(装载因子)。HashMap 的构造方法有两个,一个是无参构造方法,另一个是包含 ...

    JAVA hashmap 负载因子为什么是0.75,官方解释

    java hashmap 扩容因子为什么是0.75,官方给出的解释

    HashMap与HashTable和HashSet的区别

    - **初始容量和加载因子**:`HashMap`同样允许设置初始容量和加载因子。与`HashTable`一样,默认的加载因子为0.75。 - **弱引用**:`HashMap`有一个子类`WeakHashMap`,其中的键是弱引用。这意味着如果一个键没有...

    基于Java中最常用的集合类框架之HashMap(详解)

    这三个构造函数分别创建了具有默认初始容量和加载因子的空HashMap、具有指定初始容量和默认加载因子的空HashMap、和具有指定初始容量和加载因子的空HashMap。 HashMap的数据结构是一种“链表散列”,它由一个数组和...

    hashmap.zip

    3. **负载因子**:HashMap有一个名为`loadFactor`的属性,用于控制当HashMap达到多大容量时需要进行扩容。默认负载因子为0.75,意味着当HashMap实际使用的容量达到其容量的75%时,会自动扩容。 4. **扩容机制**:当...

    HashMap和HashTable的区别和不同

    - 当负载因子超过0.75时,`HashMap`会自动扩容,新的容量为原来的两倍。这种扩容策略有助于保持良好的性能。 - **HashTable**: - 默认大小为11。`HashTable`不对指定的初始容量进行特殊处理,因此可能不是2的幂。...

    剖析Java中HashMap数据结构的源码及其性能优化

    HashMap的构造函数允许用户自定义初始容量和装载因子。如果用户没有提供,将会使用默认值。例如,`public HashMap(int initialCapacity, float loadFactor)` 构造函数会检查输入的有效性,并根据传入的参数计算出...

    HashMap的数据结构

    2. **装载因子**:装载因子是HashMap的一个关键参数,表示已存储元素数量与数组大小的比率。默认装载因子为0.75,当元素数量达到装载因子与数组长度乘积时,HashMap会自动进行扩容。扩容会创建一个新的更大的数组,...

    HashMap 分析

    在本分析中,我们将会详细探讨HashMap在不同负载因子(loadFactor)、循环次数(loop)、哈希表长度(maptablelen)和映射长度(maplen)等条件下的行为和特性。 负载因子(loadFactor)是HashMap中的一个关键参数...

    深入理解Java之HashMap —— 03

    HashMap的构造函数允许用户指定初始容量(initialCapacity)和负载因子(loadFactor)。如果初始容量小于0或负载因子非正数,构造函数会抛出IllegalArgumentException。初始化时,HashMap并不会立即创建数组,而是...

Global site tag (gtag.js) - Google Analytics