首页 > 安全资讯 >

HashMap源码解析(二)

17-02-10

HashMap源码解析(二):这里的table,就是所谓的 “桶” 的概念,存储 键 值 对。它的长度必须为2的次幂,原因不知。

HashMap源码解析(二):这里的table,就是所谓的 “桶” 的概念,存储 键/值 对。它的长度必须为2的次幂,原因不知。

具体一点,table的初始长度是 DEFAULT_INITIAL_CAPACITY(16),当存储数量的元素大于 16*0.75 时,会进行扩充容量,长度变为 1 << 4 (32)。

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

static final int MAXIMUM_CAPACITY = 1 << 30;

// 默认的加载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;

// 空的桶
static final Entry[] EMPTY_TABLE = {};

// 桶,按需调整大小,长度为2的次幂(长度的限制为何如此?)
transient Entry[] table = (Entry[]) EMPTY_TABLE;

transient int size;

// 负载值,下次扩容的临界值,为:(capacity * load factor)
int threshold;

// 加载因子
final float loadFactor;

transient int modCount;

Holder

下面的代码还不太理解,述说是:
“ALTERNATIVE_HASHING_THRESHOLD_DEFAULT 针对与字符串的key,提供一个新的hash算法会提供更好的hashcode分布减少冲突,如果想启用尝鲜这个特性,你需要设置jdk.map.althashing.threshold这个系统属性的值为一个非负数(默认是-1)这个值代表了一个集合大小的threshold,超过这个值,就会使用新的hash算法。需要注意的一点,只有当re-hash的时候,新的hash算法才会起作用。

而Holder本身只是加载获取这个配置参数而已。”

// 备选的负载值,以String作为Key时的备选负载值。
static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;

private static class Holder {

    /**
     * Table capacity above which to switch to use alternative hashing.
     */
    static final int ALTERNATIVE_HASHING_THRESHOLD;

    static {
        String altThreshold = java.security.AccessController.doPrivileged(
            new sun.security.action.GetPropertyAction(
                "jdk.map.althashing.threshold"));

        int threshold;
        try {
            threshold = (null != altThreshold)
                    ? Integer.parseInt(altThreshold)
                    : ALTERNATIVE_HASHING_THRESHOLD_DEFAULT;

            // disable alternative hashing if -1
            if (threshold == -1) {
                threshold = Integer.MAX_VALUE;
            }

            if (threshold < 0) {
                throw new IllegalArgumentException("value must be positive integer.");
            }
        } catch(IllegalArgumentException failed) {
            throw new Error("Illegal value for 'jdk.map.althashing.threshold'", failed);
        }

        ALTERNATIVE_HASHING_THRESHOLD = threshold;
    }
}
相关文章
最新文章
热点推荐