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
311317Integer x = 100; //自动装箱,底层调用 Integer.valueOf(1)
312318Integer y = 100;
313- System.out.println(x == y); // true
319+ System.out.println(x == y); // true
314320
315321Integer x = 1000;
316322Integer 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 
@@ -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