Skip to content

Commit 8fefef0

Browse files
committed
Update Java Notes
1 parent 861f518 commit 8fefef0

File tree

2 files changed

+2528
-57
lines changed

2 files changed

+2528
-57
lines changed

Java.md

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
#### 变量类型
88

9-
| | 成员变量 | 局部变量 | 静态变量 |
10-
| :------: | :------------: | :------------------------: | :------------------: |
11-
| 定义位置 | 在类中,方法外 | 方法中或者方法的形参 | 在类中,方法外 |
12-
| 初始化值 | 有默认初始化值 | 无,先定义,复制后才能使用 | 有默认初始化值 |
13-
| 调用方法 | 对象调用 | | 对象调用,类名调用 |
14-
| 存储位置 | 堆中 | 栈中 | 方法区 |
15-
| 生命周期 | 与对象共存亡 | 与方法共存亡 | 与类共存亡 |
16-
| 别名 | 实例变量 | | 类变量,静态成员变量 |
9+
| | 成员变量 | 局部变量 | 静态变量 |
10+
| :------: | :------------: | :------------------------: | :-------------------------: |
11+
| 定义位置 | 在类中,方法外 | 方法中或者方法的形参 | 在类中,方法外 |
12+
| 初始化值 | 有默认初始化值 | 无,先定义,赋值后才能使用 | 有默认初始化值 |
13+
| 调用方法 | 对象调用 | | 对象调用,类名调用 |
14+
| 存储位置 | 堆中 | 栈中 | 方法区(JDK8 以后移到堆中) |
15+
| 生命周期 | 与对象共存亡 | 与方法共存亡 | 与类共存亡 |
16+
| 别名 | 实例变量 | | 类变量,静态成员变量 |
1717

1818
**静态变量只有一个,成员变量是类中的变量,局部变量是方法中的变量**
1919

@@ -269,7 +269,13 @@ public static Integer valueOf(int i) {
269269
}
270270
```
271271

272+
自动拆箱调用 `java.lang.Integer#intValue`,源码:
272273

274+
```java
275+
public int intValue() {
276+
return value;
277+
}
278+
```
273279

274280

275281

@@ -305,17 +311,20 @@ valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中
305311
- Integer values between -128 and 127
306312
- Character in the range \u0000 to \u007F (0 and 127)
307313

308-
在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓存池 IntegerCache 很特殊,这个缓冲池的下界是 -128,上界默认是 127,但是上界是可调的,在启动 jvm 的时候,通过 AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界
314+
在 jdk 1.8 所有的数值类缓冲池中,**Integer 的缓存池 IntegerCache 很特殊,这个缓冲池的下界是 -128,上界默认是 127**,但是上界是可调的,在启动 jvm 的时候,通过 AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界
309315

310316
```java
311317
Integer x = 100; //自动装箱,底层调用 Integer.valueOf(1)
312318
Integer y = 100;
313-
System.out.println(x == y); // true
319+
System.out.println(x == y); // true
314320

315321
Integer x = 1000;
316322
Integer y = 1000;
317-
System.out.println(x == y); // false
318-
//因为缓存池最大127
323+
System.out.println(x == y); // false,因为缓存池最大127
324+
325+
int x = 1000;
326+
Integer y = 1000;
327+
System.out.println(x == y); // true,因为 y 会调用 intValue 自动拆箱返回 int 原始值进行比较
319328
```
320329

321330

@@ -2293,15 +2302,15 @@ public boolean equals(Object o) {
22932302
}
22942303
```
22952304

2296-
**面试题**:== 和equals的区别
2305+
**面试题**:== 和 equals 的区别
22972306

22982307
* == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的**地址**是否相同,即是否是指相同一个对象,比较的是真正意义上的指针操作。
2299-
* 重写equals方法比较的是两个对象的**内容**是否相等,所有的类都是继承自java.lang.Object类,所以适用于所有对象,如果**没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,比较两个对象的引用**
2308+
* 重写 equals 方法比较的是两个对象的**内容**是否相等,所有的类都是继承自 java.lang.Object 类,所以适用于所有对象,如果**没有对该方法进行覆盖的话,调用的仍然是 Object 类中的方法,比较两个对象的引用**
23002309

2301-
hashCode的作用
2310+
hashCode 的作用
23022311

2303-
* hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,可以在散列存储结构中确定对象的存储地址
2304-
* 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同
2312+
* hashCode 的存在主要是用于查找的快捷性,如 Hashtable,HashMap 等,可以在散列存储结构中确定对象的存储地址
2313+
* 如果两个对象相同,就是适用于 equals(java.lang.Object) 方法,那么这两个对象的 hashCode 一定要相同
23052314
* 哈希值相同的数据不一定内容相同,内容相同的数据哈希值一定相同
23062315

23072316

@@ -2318,23 +2327,23 @@ hashCode的作用:
23182327

23192328
* 深拷贝 (deepCopy):对基本数据类型进行值传递,对引用数据类型是一个整个独立的对象拷贝,会拷贝所有的属性并指向的动态分配的内存,简而言之就是把所有属性复制到一个新的内存,增加一个指针指向新内存。所以使用深拷贝的情况下,释放内存的时候不会出现使用浅拷贝时释放同一块内存的错误
23202329

2321-
Object 的 clone() 是 protected 方法,一个类不显式去重写 clone(),就不能直接去调用该类实例的clone()方法
2330+
Object 的 clone() 是 protected 方法,一个类不显式去重写 clone(),就不能直接去调用该类实例的 clone() 方法
23222331

23232332
克隆就是制造一个对象的副本,根据所要克隆的对象的成员变量中是否含有引用类型,可以将克隆分为两种:浅克隆(Shallow Clone) 和 深克隆(Deep Clone),默认情况下使用Object中的clone方法进行克隆就是浅克隆,即完成对象域对域的拷贝
23242333

2325-
Cloneable 接口是一个标识性接口,即该接口不包含任何方法(包括clone()),但是如果一个类想合法的进行克隆,那么就必须实现这个接口,在使用clone()方法时,若该类未实现 Cloneable 接口,则抛出异常
2334+
Cloneable 接口是一个标识性接口,即该接口不包含任何方法(包括clone()),但是如果一个类想合法的进行克隆,那么就必须实现这个接口,在使用 clone() 方法时,若该类未实现 Cloneable 接口,则抛出异常
23262335

23272336
* Clone & Copy:`Student s = new Student`
23282337

2329-
`Student s1 = s`:只是copy了一下reference,s和s1指向内存中同一个object,对对象的修改会影响对方
2338+
`Student s1 = s`:只是 copy 了一下 reference,s 和 s1 指向内存中同一个 object,对对象的修改会影响对方
23302339

23312340
`Student s2 = s.clone()`:会生成一个新的Student对象,并且和s具有相同的属性值和方法
23322341

23332342
* Shallow Clone & Deep Clone:
23342343

2335-
浅克隆:Object中的clone()方法在对某个对象克隆时对其仅仅是简单地执行域对域的copy
2344+
浅克隆:Object中的 clone() 方法在对某个对象克隆时对其仅仅是简单地执行域对域的 copy
23362345

2337-
* 对基本数据类型和包装类的克隆是没有问题的。String、Integer等包装类型在内存中是不可以被改变的对象,所以在使用克隆时可以视为基本类型,只需浅克隆引用即可
2346+
* 对基本数据类型和包装类的克隆是没有问题的。String、Integer 等包装类型在内存中是不可以被改变的对象,所以在使用克隆时可以视为基本类型,只需浅克隆引用即可
23382347
* 如果对一个引用类型进行克隆时只是克隆了它的引用,和原始对象共享对象成员变量
23392348

23402349
![](https://gitee.com/seazean/images/raw/master/Java/Object浅克隆.jpg)
@@ -9526,8 +9535,8 @@ JVM 内存结构规定了 Java 在运行过程中内存申请、分配、管理
95269535

95279536
线程运行诊断:
95289537

9529-
* 定位:jps定位进程id
9530-
* jstack 进程id:用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息
9538+
* 定位:jps 定位进程 id
9539+
* jstack 进程 id:用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息
95319540

95329541
常见OOM错误:
95339542

@@ -9803,7 +9812,7 @@ public static void main(String[] args) {
98039812

98049813
方法区的 GC:针对常量池的回收及对类型的卸载,比较难实现
98059814

9806-
为了**避免方法区出现OOM**,在 JDK8 中将堆内的方法区(永久代)移动到了本地内存上,重新开辟了一块空间,叫做元空间,元空间存储类的元信息,静态变量和字符串常量池等放入堆中
9815+
为了**避免方法区出现OOM**,在 JDK8 中将堆内的方法区(永久代)移动到了本地内存上,重新开辟了一块空间,叫做元空间,元空间存储类的元信息,**静态变量和字符串常量池等放入堆中**
98079816

98089817
类元信息:在类编译期间放入方法区,存放了类的基本信息,包括类的方法、参数、接口以及常量池表
98099818

0 commit comments

Comments
 (0)