Skip to content

Commit 32e4353

Browse files
hashmap源码学习
hashmap源码学习
1 parent 375d875 commit 32e4353

15 files changed

Lines changed: 5356 additions & 36 deletions

AlgorithmAndDataStructure/10-映射.md

Lines changed: 967 additions & 2 deletions
Large diffs are not rendered by default.

AlgorithmAndDataStructure/11-Hash表.md

Lines changed: 1544 additions & 0 deletions
Large diffs are not rendered by default.

AlgorithmAndDataStructure/8-红黑树.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,7 @@ Process finished with exit code 0
10081008
什么是平衡?即树的高度越矮越平衡
10091009

10101010
- 相比AVL树,红黑树的平衡标准比较宽松:**没有一条路径会大于其他路径的2倍**
1011-
- 是一种弱平衡、黑高度平衡(只算黑结点的高度都一样)
1011+
- 是一种弱平衡、黑高度平衡(**只算黑结点的高度都一样**
10121012
- 红黑树的最大高度是 2 ∗ log2(n + 1) ,依然是 O(logn) 级别
10131013

10141014
## 7. 红黑树与AVL树性能对比

AlgorithmAndDataStructure/9-集合set.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,30 @@
11
# 集合(Set)
22

3+
java中常见集合
4+
5+
```css
6+
Collection 接口的接口 对象的集合(单列集合)
7+
├——-List 接口:元素按进入先后有序保存,可重复
8+
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
9+
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
10+
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
11+
│ ———————- Stack 是Vector类的实现类
12+
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
13+
├—————-HashSet 使用hash表(数组)存储元素
14+
│————————└ LinkedHashSet 链表维护元素的插入次序
15+
└ —————-TreeSet 底层实现为红黑树,元素排好序
16+
17+
Map 接口 键值对的集合 (双列集合)
18+
├———Hashtable 接口实现类, 同步, 线程安全
19+
├———HashMap 接口实现类 ,没有同步, 线程不安全
20+
│—————–├ LinkedHashMap 双向链表和哈希表实现
21+
│—————–└ WeakHashMap
22+
├ ——–TreeMap 红黑树对所有的key进行排序
23+
└———IdentifyHashMap
24+
```
25+
26+
27+
328
## 1. 接口设计
429

530
集合的特点
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# 十大经典排序
2+
3+
十大经典排序概览:
4+
5+
![image-20220714162210016](https://cdn.fengxianhub.top/resources-master/202207141622322.png)

JVM/2-JVM运行时数据区.md

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ Java Virtual Machine Stacks(Java虚拟机栈)
4242
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
4343
- 活动栈帧就是栈顶的栈帧
4444

45+
每个栈帧中存储着:
46+
47+
- 局部变量表(Local Variables)
48+
- 操作数栈(operand Stack)(或表达式栈)
49+
- 动态链接(DynamicLinking)(或指向运行时常量池的方法引用)
50+
- 方法返回地址(Return Address)(或方法正常退出或者异常退出的定义)
51+
- 一些附加信息
52+
4553
常见面试题:
4654

4755
>垃圾回收是否涉及栈内存?
@@ -92,7 +100,89 @@ Java Virtual Machine Stacks(Java虚拟机栈)
92100

93101
![image-20220531174919845](https://cdn.fengxianhub.top/resources-master/202205311749136.png)
94102

95-
本地方法栈就是存放native方法的空间,线程私有
103+
本地方法栈就是存放native方法的空间,线程私有简单地讲,一个`Native Method`是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "c" 告知c++编译器去调用一个c的函数。
104+
105+
"A native method is a Java method whose implementation is provided by non-java code."(本地方法是一个非Java的方法,它的具体实现是非Java代码的实现)
106+
107+
在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。
108+
109+
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。
110+
111+
```java
112+
/**
113+
* <p>
114+
* 本地方法示例
115+
* </p>
116+
*
117+
* @since: 2022/7/13 8:58
118+
* @author: 梁峰源
119+
*/
120+
public class IhaveNatives {
121+
public native void Native1(int x);
122+
native static public long Native2();
123+
native synchronized private float Native3(Object o);
124+
native void Natives(int[] args) throws Exception;
125+
}
126+
```
127+
128+
**需要注意的是:标识符native可以与其它java标识符连用,但是abstract除外**
129+
130+
### 3.1 实现native方法
131+
132+
接下来我们自己实现一个native方法
133+
134+
先编写一段java代码,这里面请不要带中文,并且不要带报名,文件里面只有下面出现的内容
135+
136+
```java
137+
public class TestJNI {
138+
public native void hello();
139+
static {
140+
System.setProperty("java.library.path",".");
141+
System.loadLibrary("dllhelloworld");
142+
}
143+
public static void main(String[] args){
144+
new TestJNI().hello();
145+
}
146+
}
147+
```
148+
149+
到文件所在目录下使用javah命令将其打成.h的文件
150+
151+
```java
152+
javah -jni TestJNI
153+
```
154+
155+
![image-20220713102253939](https://cdn.fengxianhub.top/resources-master/202207131022193.png)
156+
157+
库文件内容如下:
158+
159+
```c
160+
/* DO NOT EDIT THIS FILE - it is machine generated */
161+
#include <jni.h>
162+
/* Header for class TestJNI */
163+
164+
#ifndef _Included_TestJNI
165+
#define _Included_TestJNI
166+
#ifdef __cplusplus
167+
extern "C" {
168+
#endif
169+
/*
170+
* Class: TestJNI
171+
* Method: hello
172+
* Signature: ()V
173+
*/
174+
JNIEXPORT void JNICALL Java_TestJNI_hello
175+
(JNIEnv *, jobject);
176+
177+
#ifdef __cplusplus
178+
}
179+
#endif
180+
#endif
181+
```
182+
183+
这里我们需要记住文件名`Java_TestJNI_hello`
184+
185+
96186

97187
## 4. 堆
98188

JVM/3-垃圾回收.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,8 @@ cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
306306
4. 虚引用(PhantomReference) 必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队, 由 Reference Handler 线程调用虚引用相关方法释放直接内存
307307
5. 终结器引用(FinalReference) 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象 暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize 方法,第二次 GC 时才能回收被引用对象
308308

309+
#### 1.3.6 ThreadLocal内存泄露问题
310+
309311
## 2. 垃圾清除算法
310312

311313
<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/generations.html#sthref16">垃圾回收Hotspot jdk1.8 oracle官方文档</a>
@@ -1221,7 +1223,7 @@ Oracle recommends that you keep the size for the young generation greater than 2
12211223

12221224
>案例3 老年代充裕情况下,发生 Full GCCMS jdk1.7
12231225

1224-
1226+
6.
12251227

12261228

12271229

JVM/JVM常见面试题.md

Lines changed: 175 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,134 @@ public class Demo {
314314

315315
**编译器会按从上至下的顺序,收集所有 {} 代码块和成员变量赋值的代码,形成新的构造方法,但原始构造方法内的代码总是在最后!**
316316

317+
## 常见面试题二
318+
319+
>jvm运行时数据区的划分?
320+
321+
![image-20220531143854437](https://cdn.fengxianhub.top/resources-master/202205311438599.png)
322+
323+
>根据jvm规范,这些数据区中哪些会出现内存溢出异常,分别是什么场景下出现?
324+
325+
只是程序计数器是不会存在内存溢出(java中唯一不用考虑内存溢出的地方)
326+
327+
- 栈空间:java.lang.StackOverflowError
328+
329+
以下情况可能会导致栈内存溢出:
330+
331+
- 栈帧过多导致栈内存溢出(例如不合理的递归调用)
332+
- 栈帧过大导致栈帧溢出
333+
- 类的循环引用导致内存溢出
334+
335+
- 堆内存溢出:java.lang.OutOfMemoryError: Java heap space
336+
337+
堆空间申请过多
338+
339+
340+
341+
>这些数据区哪些是线程独有的,哪些是线程共享区?
342+
343+
![image-20220531144228815](https://cdn.fengxianhub.top/resources-master/202205311442898.png)
344+
345+
>每个区存储的数据的特点?
346+
347+
348+
349+
>程序计数器是什么,它是线程独有的吗? 它是否有内存溢出问题.
350+
351+
在java中使用CPU寄存器作为程序计数器
352+
353+
作用:是记住下一条JVM指令的执行地址
354+
355+
特点:
356+
357+
1. 是线程私有的,每个线程都有自己的程序计数器,用来记录程序运行到了那个位置
358+
2. 不会存在内存溢出(java中唯一不用考虑内存溢出的地方)
359+
360+
>虚拟机栈上保存哪些数据?怎么放?虚拟机栈是线程独有的吗,它是否有内存溢出问题?虚拟机栈的优点?
361+
362+
Java Virtual Machine StacksJava虚拟机栈)
363+
364+
- 每个线程运行时所需要的内存,称为虚拟机栈
365+
- 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
366+
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
367+
- 活动栈帧就是栈顶的栈帧
368+
369+
虚拟机栈式线程独有的,存在内存溢出的问题
370+
371+
**基于栈式架构的特点**
372+
373+
- 设计和实现更简单,适用于资源受限的系统;
374+
- 避开了寄存器的分配难题:使用零地址指令方式分配。
375+
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。
376+
- 不需要硬件支持,可移植性更好,更好实现跨平台
377+
378+
>虚拟机栈的大小是否可动?是否会有异常出现?
379+
380+
381+
382+
>如何设置虚拟机栈大小?
383+
384+
我可以通过JVM指令来分配栈空间,如果不指定会默认分配。<a href="https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE">Java官方文档</a>
385+
386+
![image-20220531151856031](https://cdn.fengxianhub.top/resources-master/202205311518196.png)
387+
388+
>什么叫本地方法? 是否可以写一个例子来实现本地方法,以输出一个hello world?
389+
390+
391+
392+
>什么叫本地方法栈?有什么作用?
393+
394+
395+
396+
>jvm规范一定强制要求实现本地方法栈吗?
397+
398+
399+
400+
>jvm规范一定强制要求实现本地方法栈吗
401+
402+
403+
404+
>方法区是线程独有的吗?它是否有异常?它的作用?
405+
406+
不是,是线程共享的
407+
408+
1.8 以前会导致永久代(PermGen)内存溢出
409+
410+
```css
411+
演示永久代内存溢出 java.lang.OutOfMemoryError: PermGen space
412+
-XX:MaxPermSize=8m
413+
```
414+
415+
1.8 之后会导致元空间内存溢出
416+
417+
```css
418+
演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
419+
-XX:MaxMetaspaceSize=8m
420+
```
421+
422+
>方法区的演进, jdk7及以前,它叫什么? jdk8开始,这又叫什么
423+
424+
425+
426+
427+
>方法区或永久代的大小如何设置?
428+
429+
1.8 以前会导致永久代(PermGen)内存溢出
430+
431+
```css
432+
演示永久代内存溢出 java.lang.OutOfMemoryError: PermGen space
433+
-XX:MaxPermSize=8m
434+
```
435+
436+
1.8 之后会导致元空间内存溢出
437+
438+
```css
439+
演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
440+
-XX:MaxMetaspaceSize=8m
441+
```
442+
443+
## 常见面试题三
444+
317445

318446

319447
## 大厂JVM
@@ -366,33 +494,65 @@ Java的垃圾回收器都有哪些,说下g1的应用场景,平时你是如
366494

367495
## 大厂面试题二
368496

369-
- CMSG1的异同
497+
>CMSG1的异同
498+
499+
500+
501+
>G1什么时候引发Full GC
502+
503+
504+
505+
>聊下垃圾回收算法,各有什么利弊
506+
507+
508+
509+
>垃圾回收器背一下,特点和应用场景
510+
511+
垃圾回收器主要分为三类
512+
513+
514+
515+
>怎么判断内存泄露
516+
517+
518+
519+
>CMS垃圾回收的流程
520+
521+
522+
523+
>为什么要有压缩指针?超过多少会失效?为什么超过会失效?
524+
525+
1.64位平台的HotSpot中使用32位指针,内存使用会多出1.5倍左右,使用较大指针在主内存和缓存之间移动数据,***占用较大带宽,同时GC也会承受较大的压力***
526+
2. 为了***减少64*** 平台下***内存******消耗***,启用指针压缩功能
527+
3.JVM中,32位地址最大支持4G内存(232次方),可以通过对对象指针的压缩编码、解码方式进行优化,使得JVM只用32位地址就可以支持更大的内存配置(小于等于32G)
528+
4. 堆空间小于4G时,不需要启用指针压缩,JVM会直接去除高32位地址,即使用低虚拟地址空间
529+
5. ***堆内存大于32G时,压缩指针会失效***,会强制使用64位(即8字节)来对Java对象寻址,这就会出现1中的问题,所以堆内存不要大于32G为好
530+
531+
>怎么解决线上OOM问题,你是如何进行GC调优的
532+
533+
534+
535+
>ThreadLocal有没有内存泄露问题
536+
537+
538+
539+
>G1两个Region不是连续的,而且之间没有可达的引用,我现在要回收一个,另一个要如何处理
370540

371-
- G1什么时候引发Full GC
372541

373-
- 聊下垃圾回收算法,各有什么利弊
374542

375-
- 垃圾回收器背一下,特点和应用场景
543+
>JVM堆内存管理(对象分配过程)
376544

377-
- 怎么判断内存泄露
378545

379-
- CMS垃圾回收的流程
380546

381-
- 为什么压缩指针超过32G会失效
547+
>讲一下CMS的并发预处理和并发可中断预处理
382548

383-
- 怎么解决线上OOM问题,你是如何进行GC调优的
384549

385-
- ThreadLocal有没有内存泄露问题
386550

387-
- G1两个Region不是连续的,而且之间没有可达的引用,我现在要回收一个,另一个要如何处理
551+
>多大的内存会直接晋升到老年代
388552

389-
- JVM堆内存管理(对象分配过程)
390553

391-
- 讲一下CMS的并发预处理和并发可中断预处理
392554

393-
- 多大的内存会直接晋升到老年代
555+
>ZGC的m0和m1模式分别是什么?
394556

395-
- ZGC的m0和m1模式分别是什么?
396557

397-
398558

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@
7070
**缓存相关**
7171

7272
- [Redis基本使用](/中间件/Redis/Redis学习笔记.md)
73-
- [Redis分布式缓存](/SpringCloud/黑马SpringCloud-阿里巴巴/9-分布式缓存.md)
73+
- [Redis分布式缓存(持久化和高可用)](/SpringCloud/黑马SpringCloud-阿里巴巴/9-分布式缓存.md)
74+
- [Redis源码分析(C源码就不能分析吗?)](/中间件/Redis/redis源码分析.md)
7475
- [OpenResty-Redis-Caffine分布式多级缓存链](/SpringCloud/黑马SpringCloud-阿里巴巴/10-多级缓存.md)
7576

7677
## 💊 数据结构与算法

0 commit comments

Comments
 (0)