HashMap源码解析——构造方法

原创 2017年07月22日 22:53:42

上篇博文列取了HashMap的关键属性,本篇主要看构造方法

HashMap的几个构造方法:
补充下

//加载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//容量
static final int MAXIMUM_CAPACITY = 1 << 30;
static final int MIN_TREEIFY_CAPACITY = 64;

public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }

public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

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);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }

public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
    }

我们可以看到在构造HashMap的时候如果我们指定了加载因子和初始容量的话就调用第一个构造方法,否则的话就是用默认的。默认初始容量为16,默认加载因子为0.75。

下面我们再看下构造方法中调用的tableSizeFor(initialCapacity);方法

    /**
     * Returns a power of two size for the given target capacity.
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }
版权声明:本文为博主原创,转载请注明出处(http://blog.csdn.net/jdjh1024).

JDK1.8 HashMap源码分析

JDK1.8  HashMap源码分析 一、HashMap概述 在JDK1.8之前,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中...
  • lizhongkaide
  • lizhongkaide
  • 2016年01月27日 17:28
  • 2587

HashMap类源码解析

HashMap特点: 1.key-value键值对表示一个数据项 2.内部通过数组实现 3.没有实现同步方法,多线程线程不安全,效率较高 4. 所在包package java.uti...
  • qunxingvip
  • qunxingvip
  • 2016年07月16日 20:27
  • 1369

HashMap源码深度解析

这里新增加节点采用了头插法,新节点都增加到头部,新节点的next指向老节点 这里涉及到了HashMap的扩容问题,随着HashMap中元素的数量越来越多,发生碰撞的概率就越来越大,所产生的链表长度就会...
  • u011617742
  • u011617742
  • 2017年01月16日 21:34
  • 786

HashMap源码解析(基于JDK1.7)

一、HashMap简介哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashM...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017年08月23日 17:15
  • 374

HashMap源码分析(jdk1.8)

HashMap源码前前后后看了好几次,也和同事分享过好几次,每次都有新的收获。 分享也是一种提高! 本文首写于个人云笔记(点击访问),经多次修改,短期内不会有重大修改了,现发于此,有任何问题欢迎交流指...
  • u010887744
  • u010887744
  • 2015年12月17日 20:24
  • 10914

HashMap源码深入解析

HashMap是Java Colletion Framework的重要成员,HashMap是Map接口的常用实现类,在我们平常开发时会经常使用到Map,在我们面试的时候也会问到map的存储原理,今天特...
  • liaodehong
  • liaodehong
  • 2016年07月25日 20:13
  • 1011

【11】Java集合:HashMap深度解析(一)

一、HashMap1.1、HashMap与HashTable的区别?记得之前去一家公司面试,问到了HashMap里是如何存放键值对的,我并不知道,然后面试官很有耐心的和我讲里面的一些细节。感恩。还有一...
  • happy_horse
  • happy_horse
  • 2016年08月25日 17:54
  • 770

【Java集合源码剖析】HashMap源码剖析

HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是...
  • mmc_maodun
  • mmc_maodun
  • 2014年07月04日 00:16
  • 21270

Java源码分析之HashMap(JDK1.8)

一、HashMap概述 HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现。与HashTable主要区别有不支持同步和允许null作为key和value。由于HashMap不是线...
  • u014026363
  • u014026363
  • 2017年02月21日 23:30
  • 1638

java中HashMap详解(从源码角度看内部实现)

HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实...
  • free4294
  • free4294
  • 2014年08月07日 15:53
  • 7455
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HashMap源码解析——构造方法
举报原因:
原因补充:

(最多只允许输入30个字)