当前位置: 首页 > news >正文

源码探究Java_HashMap

1. HashMap 定义,抽取HashMap类中主要变量,如下

public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable { 
     /** map中键值对的数量 */
     transient int size;
     /** 阀值 (阀值=加载因子*容量),达到后则扩容 */
     int threshold;
    /** 加载因子,默认0.75*/
     final float loadFactor;   
    /** 计算hash值的种子*/
    transient int hashSeed = 0; 
    /**  数组 */
    transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
    /** 链表节点定义 */
    static class Entry<K,V> implements Map.Entry<K,V> {
        /** 键名 */
        final K key;
        /** 键值 */
        V value;
        /** 后继节点 */
        Entry<K,V> next;
        /** 当前key的hash值 */
        int hash;
    }
}    

2. hash值如何计算

    final int hash(Object k) {
        int h = hashSeed;
     /** 字符串hash计算 */
if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); /**此函数确保在每个位位置仅相差常数倍的hashCodes具有有限的冲突数(默认加载因子大约为8)*/ h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }

 

3. 在上一步中查看字符串怎么计算hash值的时候发现HashMap内部的一个恶汉式的单例实现

private static class Holder {
  static final JavaLangAccess LANG_ACCESS = SharedSecrets.getJavaLangAccess();
  private Holder() {
   }

   static {
     if(null == LANG_ACCESS) {
        throw new Error("Shared secrets not initialized");
       }
   }
}

 

  

 

转载于:https://www.cnblogs.com/hsuchan/p/9689122.html

相关文章:

  • python-第一个程序
  • 【cs231n】神经网络学习笔记3
  • 实验吧 看起来有点难(手工注入加sqlmap注入)
  • 转: CSS3 @media 用法总结
  • Python_configparser模块
  • js 中的几个假值
  • Asp.Net MVC中Action跳转小结
  • Math.round(),Math.ceil(),Math.floor()的区别
  • Betsy's Tour 漫游小镇(dfs)
  • [BZOJ4010]菜肴制作
  • 11.表达式语言
  • 测量软件的使用感受
  • 关于自学C语言开始时应该注意的问题分享—未完待续......
  • CSS position 属性
  • 高可用并发集群lvs的几种模式及应用
  • 【node学习】协程
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • co.js - 让异步代码同步化
  • docker python 配置
  • ESLint简单操作
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Spark学习笔记之相关记录
  • Webpack 4x 之路 ( 四 )
  • 构建二叉树进行数值数组的去重及优化
  • 通信类
  • 用element的upload组件实现多图片上传和压缩
  • nb
  • ​Spring Boot 分片上传文件
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​业务双活的数据切换思路设计(下)
  • #Linux(Source Insight安装及工程建立)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)fgets与fputs函数详解
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (二十四)Flask之flask-session组件
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (接口封装)
  • (十三)Flask之特殊装饰器详解
  • (四)Controller接口控制器详解(三)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)Windows2003安全设置/维护
  • (转)程序员技术练级攻略
  • (转)为C# Windows服务添加安装程序
  • *Django中的Ajax 纯js的书写样式1
  • ./configure,make,make install的作用(转)
  • .NET Framework 4.6.2改进了WPF和安全性
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BUG]vscode插件live server无法自动打开浏览器
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [CCIE历程]CCIE # 20604
  • [Codeforces] combinatorics (R1600) Part.2
  • [COI2007] Sabor
  • [C语言]——柔性数组