
JDK源码分析
JDK的一些源码分析
源大郎
这个作者很懒,什么都没留下…
展开
-
LRU使用LinkedHashMap实现(主要分析LinkedHashMap的原理)
LC上有这么一道题让实现一个LRU,LRU如上描述就是一个有容量限制当容量满时会自动移除最后一次时间时间最晚的缓存结构。想到Redis中的ZSET结构(主要是想到了昨天学的漏斗限流…),不过只能存储key不能存储value…在Java中也有排序表的结构,可以使用一个TreeMap,key为一个HashMap,HashMap存储题目中的key和value,TreeMap的value为操作时间戳,每访问一次或者修改一次就更新。如果超出容量设定了就移除时间戳最靠前的那一个。不过Java中有种更合适于干这事.原创 2020-06-17 02:51:42 · 538 阅读 · 0 评论 -
《Java并发编程的艺术》第六章Java并发容器和框架(1)ConcurrentHashMap(基于JDK11)
这一章讲得有点泛(不过讲详细了估计就得写四章不止了2333),用的JDK版本也与我的不一样(我的是11)…emmm按着书的思路,本地的JDK源码梳理吧。ConcurrentHashMapConcurrentHashMap简单的说就是并发下使用的HashMap。为啥不直接用HashMap呢?一方面是值会丢失(这个倒是好理解,阔能出现覆盖的情况,如果俩线程盯着的是同一个地方的话,就会出现这个问题,而且如果是红黑树可能出现,虽然存了看着没丢失,但是如果再转换回链表估计还会丢几个)。另一方面就是会引发死循原创 2020-05-17 19:20:25 · 431 阅读 · 0 评论 -
浅析HashMap(均基于JDK11)
浅析HashMap(jdk11)【1】初始化部分(静态域、实例域、构造函数、扩容)浅析HashMap【2】查增浅析HashMap【3】删替原创 2020-05-15 16:07:20 · 197 阅读 · 0 评论 -
浅析HashMap【3】删替
删同样看主要部分这个查部分理解,问题不大,整个方法还是分为两部分1.查找,不讲了,就是普通的查找2.final Node<K,V> removeNode(int hash, Object key, Object value, boolean matchValue, boolean movable) { Node<K,V>[] tab; Node<K,V> p; int n, index原创 2020-05-14 20:17:54 · 247 阅读 · 0 评论 -
浅析HashMap【2】查增
查真正的实现就是这个。首先判断桶表是不是未实例化,然后再判断桶表的长度是否大于0,最后再判断检索到的桶表索引是否为空。如果以上条件都满足后。再看是否为头结点(同一对象或者相同对象),如果是返回头结点的值。再判断是否为红黑树结构,如果是,以红黑树的查询方式,则首先比较其哈希值的大小关系来找,如果哈希值是一样的(如果出现这种情况估计真能中彩票了,要不然就是彩票基本上被包圆了(滑稽)),那么看是否实现了Comparable接口,如果实现了按照这个大小关系查找,如果没有实现那就深搜吧。所以加入HashM原创 2020-05-14 02:25:38 · 206 阅读 · 0 评论 -
浅析HashMap(jdk11)【1】初始化部分(静态域、实例域、构造函数、扩容)
看《Java并发编程的艺术》到第六章了,讲并发框架的,里面提到了使用HashMap会出现循环引用的情况,搜了下,HashMap1.7在扩容时采用头插法,会成环,导致多线程的场景下容易出现死循环;然后又听说1.8的红黑树也会出现成环的问题…就有点好奇hashmap内部是咋样的了,俺这边没有jdk8,7的环境。就看看11的吧(虽然1.8那个bug我是一直没复现出来)先看一下UML吧,好像是有点复杂的亚子,一点一点看吧静态属性从上到下解释第一个不用解释吧,序列号DEFAULT_INITIAL_C原创 2020-05-13 05:38:40 · 493 阅读 · 0 评论