Browse Source

修改java高阶的一些文档

seamew 2 years ago
parent
commit
59a02e7bda

+ 4 - 4
后端/Java/JAVA高阶/ArrayList/ArrayList源码分析.md

@@ -14,7 +14,7 @@ ArrayList:源码难点	扩容和缩容
 
 ## 扩容方法
 
-```
+```java
 private void ensureExplicitCapacity(int minCapacity) {
 	// 线程同步,不能在遍历的时候进行添加或者删除操作
     modCount++;
@@ -25,7 +25,7 @@ private void ensureExplicitCapacity(int minCapacity) {
 }
 ```
 
-```
+```java
 private void grow(int minCapacity) {
 	// 初始化容量为0
     int oldCapacity = elementData.length;
@@ -48,7 +48,7 @@ private void grow(int minCapacity) {
 
 注意hashmap集合没有缩容,因为缩容需要重新计算index值
 基于value值删除复杂度为O(n),需要考虑缩容问题
-```
+```java
 public boolean remove(Object o) {
     if (o == null) {
         for (int index = 0; index < size; index++)
@@ -70,7 +70,7 @@ public boolean remove(Object o) {
 
 ## 快速覆盖
 
-```
+```java
 private void fastRemove(int index) {
 	// 线程同步,不能在遍历的时候进行添加或者删除操作
     modCount++;

BIN
后端/Java/JAVA高阶/HashMap/assets/image-20211109155715277.png


+ 3 - 3
后端/Java/JAVA高阶/HashMap/第一节课数组加链表&时间复杂度的对比.md

@@ -44,8 +44,8 @@ HashMap基本单向链表实现
 效率比HashMap低,
 原理:将每个index链表实现关联
 
-LRU(最近少使用)缓存淘汰算法
-LFU(最不经常使用算法)缓存淘汰算法
+LRU(最近少使用)缓存淘汰算法 -- 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;当链表满的时候,将链表尾部的数据丢弃。
+LFU(最不经常使用算法)缓存淘汰算法 -- LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。
 ARC(自适应缓存替换算法)缓存淘汰算法
 FIFO(先进先出算法)缓存淘汰算法
 MRU(最近最常使用算法)缓存淘汰算法
@@ -58,7 +58,7 @@ MRU(最近最常使用算法)缓存淘汰算法
 
 ## HashMap如何降低Hash冲突概率
 
-```
+```java
 static final int hash(Object key) {
     int h;
     return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

+ 4 - 4
后端/Java/JAVA高阶/HashMap/第三节ConcurrentHashMap1.7.md

@@ -15,7 +15,7 @@ CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A
 
 ## 实现原理
 
-![image-20211109155715277](../../../照片/image-20211109155715277.png)
+![image-20211109155715277](assets/image-20211109155715277.png)
 将一个大的ConcurrentHashMap集合,拆分成n多个不同的小的hashtable,在每个小的hashtable中都有自己独立的table数组。
 
 每一个segment对象就是一个hashtable,存放的时候会计算两次index值
@@ -135,11 +135,11 @@ segment的加载因子,就是table的加载因子
 为什么会执行3次这个判断?    就是为了线程安全
 seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u)) == null
 
-第一次判断==null
+第一次判断 == null
 获取s0默认参数信息,创建table对象HashEntry<K,V>[] tab = (HashEntry<K,V>[])new HashEntry[cap];
-第二个判断==null
+第二个判断 == null
 创建Segment<K,V> s = new Segment<K,V>(lf, threshold, tab);对象
-第三次判断==null
+第三次判断 == null
 通过CAS操作赋值让segment[index] = ss
 
 ## 深度解析segment的put方法

+ 1 - 1
后端/Java/JAVA高阶/HashMap/第二节课HashMap源码分析.md

@@ -12,7 +12,7 @@ static final float DEFAULT_LOAD_FACTOR = 0.75f;
 static final int TREEIFY_THRESHOLD = 8;
 5. 红黑树的节点个数小于6就将红黑树转换为链表
 static final int UNTREEIFY_THRESHOLD = 6;
-6. 数组容量大于64的情况下,将链表转换成红黑树
+6. 当Table所有元素超过改值,才会进行树化,否则会对其进行扩容
 static final int MIN_TREEIFY_CAPACITY = 64;
 
 底层采用单向链表