HashMap学习笔记

HashMap学习笔记

  1. 初始容量
    在构造HashMap的时候根据预期的entry数量考虑初始容量和负载因子,这样可以尽可能的避免rehash。如果有很多kv要存在HashMap中,创建一个足够大的实例来存储要比让hashmap需要扩容时自动rehash要更加高效。

  2. 负载因子
    load factor = entry.size / hashmap capacity

  3. Comparable
    使用许多相同hashCode的key肯定会降低性能。为了改善冲突,当key是Comparable时,这个类会通过在key之间比较顺序来打破纽带。从java8开始,当hash 冲突的长度超过一定的阈值(8)并且map的容量超过一定的阈值(64),hashMap会把链表变成一个红黑树(一直平衡)。当HashMap实现尝试在树中查找新条目的位置时,首先检查当前值和新值是否是Comparable。如果不是的话,只能通过tieBreakOrder(Object a, Object b)来比较,这个方法会先比较class name,然后使用System.identityHashCode。如果是Comparable的,那么事情就简单了,通过compareTo接口就可以比较了。值得一提的是,根据compareTo方法(该方法返回0),当两个Comparable键结果相等时,将使用相同的tieBreakOrder方法。

  4. resize(初始化table或者对table进行double 扩容)

    1. 如果没有初始化,那么此方法就是初始化table的方法,默认的capacity是16,负载因子是0.75。
    2. 已经初始化,那么要对
  5. rehash过程(参考链接

    • java7 resize过程中每一个元素都要重新通过indexFor(hash)计算位置,然后将元素插入到新数据到链表头部,形成了反序(在并发的情况下有可能形成回环)。
    • java8 采用2倍扩容,扩容后,resize过程中,每一个元素通过与oldCap取&,看看结果是1还是0,如果是0的话,分配新表的原索引位置,如果是1的话,分配到新表的(原索引位置+oldCap)位置,两者都是将元素插入到链表尾(保持了元素相对顺序没有发生变化)。这个原因是在根据hash定位数组索引位置的时候是通过hash&(n-1)来做的,2倍扩容以后hash&(n-1)的结果只有高位会发生变化,只有发生变化的才需要迁移到新的索引位置,可以通过hash&oldCap得到高位的值,通过高位的值是否为1来判断采取的动作
  6. 线程安全
    HashMap是非线程安全的,如果有多个线程并发地对hashmap进行结构性变化,那么就必须额外的同步。通常是由同步持有HashMap实例的对象来完成对hashmap的同步的。如果没有这样的对象存在,这个map应该被Collections.synchronizedMap方法来包装,最好是在创建时完成,来阻止意外的非同步的对hashmap的访问。HashMap的所有视图方法都是Fail-Fast的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,896评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,283评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,085评论 0 367
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,010评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,015评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,492评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,858评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,829评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,374评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,409评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,527评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,131评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,858评论 3 339
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,296评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,434评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,087评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,597评论 2 366

推荐阅读更多精彩内容

  • 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Deve...
    周二倩你一生阅读 1,255评论 0 5
  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 6,671评论 9 107
  • 杨倩,焦点讲师三期,坚持分享492天(2018-5-6) 规则 实践证明,事先的约定比时...
    温心怡然阅读 102评论 0 0
  • 今年我二十,大二 上大学这两年我一直不知道自己到底是在上些什么,我无数次思考这几年我到底在干些什么,干了些什么,甚...
    变变阅读 225评论 0 0
  • 15年前踏入大学校门,和舍友们相处不过短短一周的时间,我就深刻地意识到:家乡的教育很落后,最大的落后就是教育资源的...
    12点4元阅读 174评论 0 0