热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HashMap源码解析一、构造函数,华为软件开发面试题

this(initialCapacity,DEFAULT_LOAD_FACTOR);}**paraminitialCapacity初始容量paramloadFactor负载因子

this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

/**

  • @param initialCapacity 初始容量
  • @param loadFactor 负载因子
    */
    public HashMap(int initialCapacity, float loadFactor) {
    if (initialCapacity <0)
    throw new IllegalArgumentException("Illegal initial capacity: " &#43;
    initialCapacity);
    if (initialCapacity > MAXIMUM_CAPACITY)
    initialCapacity &#61; MAXIMUM_CAPACITY;
    if (loadFactor <&#61; 0 || Float.isNaN(loadFactor))
    throw new IllegalArgumentException("Illegal load factor: " &#43;
    loadFactor);
    this.loadFactor &#61; loadFactor;
    this.threshold &#61; tableSizeFor(initialCapacity);
    }

public HashMap(Map m) {
this.loadFactor &#61; DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
}

HashMap(int initialCapacity, float loadFactor) 构造函数

前两个没什么好讲的&#xff0c;我们直接看第3个 HashMap(int initialCapacity, float loadFactor)
这里的重点就是 int tableSizeFor(int cap)函数。

tableSizeFor(int cap) 函数

tableSizeFor(int cap) 的作用是返回 大于等于cap 且 最接近cap 的2的幂次方的值

static final int MAXIMUM_CAPACITY &#61; 1 <<30;
/**

  • Returns a power of two size for the given target capacity.
  • 返回 大于等于cap 且 最接近cap 的2的幂次方的值
    */
    static final int tableSizeFor(int cap) {
    int n &#61; cap - 1;
    n |&#61; n >>> 1;
    n |&#61; n >>> 2;
    n |&#61; n >>> 4;
    n |&#61; n >>> 8;
    n |&#61; n >>> 16;
    return (n <0) ? 1 : (n >&#61; MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n &#43; 1;
    }

我们分步骤解析
一下这个函数&#xff1a;

  1. >>> 无符号右移运算符&#xff0c;高位用0 填充。如下&#xff1a;

a &#61; 1010
a >>> 1 &#61; 0101

  1. | 如果相对应位都是 0&#xff0c;则结果为 0&#xff0c;否则为 1。如下&#xff1a;

a &#61; 1010
b &#61; 0011

a | b &#61; 1011

  1. |&#61; , a |&#61; b 等同于 a &#61; a|b

这时候我们就能看懂 n |&#61; n >>> 1; 等同于 n &#61; n | n >>> 1

  1. int n &#61; cap - 1; 是因为如果cap不减1&#xff0c;当 cap 本来就是2次幂数值&#xff0c;就会导致返回的结果为 cap*2 。

  2. 我们带入一个值看下运行结果&#xff0c;假设 cap &#61; 20

static final int tableSizeFor(int cap) {
System.out.println("cap &#61; "&#43; Integer.toBinaryString(cap));
int n &#61; cap - 1;
System.out.println("n &#61; "&#43; Integer.toBinaryString(n));
n |&#61; n >>> 1;
System.out.println("n1 &#61; "&#43; Integer.toBinaryString(n));
n |&#61; n >>> 2;
System.out.println("n2 &#61; "&#43; Integer.toBinaryString(n));
n |&#61; n >>> 4;
System.out.println("n4 &#61; "&#43; Integer.toBinaryString(n));
n |&#61; n >>> 8;
System.out.println("n8 &#61; "&#43; Integer.toBinaryString(n));
n |&#61; n >>> 16;
System.out.println("n16 &#61; "&#43; Integer.toBinaryString(n));
System.out.println("n&#43;1 &#61; "&#43; Integer.toBinaryString(n&#43;1));
return (n <0) ? 1 : (n >&#61; MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n &#43; 1;
}

&#64;Test
public void tableSizeForTest(){
System.out.println(“tableSizeFor:”&#43; tableSizeFor(20));
}

我这里直接把tableSizeFor(int cap) 拷贝出来&#xff0c;然后添加了日志。结果如下&#xff1a;

cap &#61; 10100
n &#61; 10011
n1 &#61; 11011 (10011 | 01001)
n2 &#61; 11111 (11011 | 01101)
cap) 拷贝出来&#xff0c;然后添加了日志。结果如下&#xff1a;

cap &#61; 10100
n &#61; 10011
n1 &#61; 11011 (10011 | 01001)
n2 &#61; 11111 (11011 | 01101)


推荐阅读
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文介绍了如何将包含复杂对象的字典保存到文件,并从文件中读取这些字典。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
author-avatar
L爱你j_828
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有