Kevin's Zone

  • Home
  • Project
  • ContactMe
  • Login
  • Register
Kevin
受苦即了苦, 享福即消福, 福尽而死
学习笔记

LinkedHashMap 底层分析

众所周知 HashMap 是一个无序的 Map,因为每次根据 key 的 hashcode 映射到 Entry 数组上,所以遍历出来的顺序并不是写入的顺序。 因此 JDK 推出一个基于 HashMap 但具有顺序的 LinkedHashMap 来解决有排序需求的场景。 它的底层是继承于 HashMap 实现的,由一个双向链表所构成。 LinkedHashMap 的排序方式有两种: 根据写入顺序排序。 根据访问顺序排序。 其中根据访问顺序排序时,每次 get 都会将访问的值移动到链表末尾,这样重复操作就能的到一个按照…

2018年4月14日 1条评论 4744点热度 3人点赞 Kevin 阅读全文
Java

ConcurrentHashMap 实现原理

由于 HashMap 是一个线程不安全的容器,主要体现在容量大于总量*负载因子发生扩容时会出现环形链表从而导致死循环。 因此需要支持线程安全的并发容器 ConcurrentHashMap 。 [title]数据结构[/title] 如图所示,是由 Segment 数组、HashEntry 数组组成,和 HashMap 一样,仍然是数组加链表组成。 ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像 HashTable 那样不管是 put 还是 ge…

2018年4月14日 0条评论 2856点热度 0人点赞 Kevin 阅读全文
Java

HashMap 底层分析

如图所示,HashMap 底层是基于数据和链表实现的。其中有两个重要的参数: 容量 负载因子 容量的默认大小是 16,负载因子是 0.75,当 HashMap 的 size > 16*0.75 时就会发生扩容(容量和负载因子都可以自由调整)。 put 方法 首先会将传入的 Key 做 hash 运算计算出 hashcode,然后根据数组长度取模计算出在数组中的 index 下标。 由于在计算中位运算比取模运算效率高的多,所以 HashMap 规定数组的长度为 2^n 。这样用 2^n - 1 做位运算与取模效…

2018年4月14日 0条评论 2836点热度 0人点赞 Kevin 阅读全文

Kevin

这个人很懒,什么都没留下

分类
  • Docker
  • 学习笔记
  • Java
  • 生活随笔
  • Spring
  • Database
  • Netty
  • Linux
  • JS/JQuery
时光轴
  • 2018年4月
  • 2018年1月
  • 2017年12月
  • 2017年10月
  • 2017年9月
  • 2017年8月
  • 2017年7月
  • 2017年3月
  • 2017年2月
  • 2017年1月
  • 2016年12月
  • 2016年11月
最近评论
Plainter 发布于 2 年前(12月10日) 嗷呜催更 :drooling:
mcdaocang 发布于 6 年前(03月30日) 宋凯哥哥?MC小刀?jsd1407?还记得吗?我是苍融松。我现在高二了。哈哈哈哈,希望是你要给我回复...
书签
  • 码农的士

COPYRIGHT © 2021 Kevin's Zone. ALL RIGHTS RESERVED.

京ICP备16064400号-1