@@ -267,13 +267,14 @@ new Integer(123) 与 Integer.valueOf(123) 的区别在于:
267267
268268valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。编译器会在自动装箱过程调用 valueOf() 方法,因此多个值相同且值在缓存池范围内的 Integer 实例使用自动装箱来创建,那么就会引用相同的对象。
269269
270- 基本类型对应的缓存池如下:
270+ ** 基本类型对应的缓存池如下:**
271271
272- - boolean values true and false
272+ - Boolean values true and false
273273- all byte values
274- - short values between -128 and 127
275- - int values between -128 and 127
276- - char in the range \u0000 to \u007F
274+ - Short values between -128 and 127
275+ - Long values between -128 and 127
276+ - Integer values between -128 and 127
277+ - Character in the range \u0000 to \u007F (0 and 127)
277278
278279在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓存池IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后IntegerCache 初始化的时候就会读取该系统属性来决定上界。
279280
@@ -509,7 +510,7 @@ public class Test1 {
509510
510511 两种运算符得到的结果完全相同,但得到结果的方式又一个重要区别:条件布尔运算符性能比较好。他检查第一个操作数的值,再根据该操作数的值进行操作,可能根本就不处理第二个操作数。
511512
512- 结论:如果&&运算符的第一个操作数是false,就不需要考虑第二个操作数的值了,因为无论第二个操作数的值是什么,其结果都是false。 同样,如果第一个操作数是true,||运算符就返回true,无需考虑第二个操作数的值。但&和|却不是这样,它们总是要计算两个操作数。为了提高性能,**尽可能使用&&和||运算符**
513+ 结论:如果&&运算符的第一个操作数是false,就不需要考虑第二个操作数的值了,因为无论第二个操作数的值是什么,其结果都是false; 同样,如果第一个操作数是true,||运算符就返回true,无需考虑第二个操作数的值。但&和|却不是这样,它们总是要计算两个操作数。为了提高性能,**尽可能使用&&和||运算符**
513514
514515* switch
515516
@@ -528,6 +529,42 @@ public class Test1 {
528529 ```
529530
530531 switch 不支持 long、float、double,switch 的设计初衷是对那些只有少数几个值的类型进行等值判断,如果值过于复杂,那么用 if 比较合适
532+
533+ * 移位运算
534+ 计算机里一般用补码表示数字,正数、负数的表示区别就是最高位是0还是1
535+
536+ * 正数的原码反码补码相同
537+
538+ ```java
539+ 100: 00000000 00000000 00000000 01100100
540+ ```
541+
542+ * 负数:
543+ 原码:最高位为1,其余位置和正数相同
544+ 反码:保证符号位不变,其余位置取反
545+ 补码:保证符号位不变,其余位置取反加1,即反码+1
546+
547+ ```java
548+ -100原码: 10000000 00000000 00000000 01100100 //32位
549+ -100反码: 11111111 11111111 11111111 10011011
550+ -100补码: 11111111 11111111 11111111 10011100
551+ ```
552+
553+ 补码-->原码:符号位不变,其余位置取反加1
554+
555+ 运算符:
556+
557+ * `>>`运算符:将二进制位进行右移操作
558+ * `<<`运算符:将二进制位进行左移操作
559+ * `>>>`运算符:无符号右移,忽略符号位,空位都以0补齐
560+
561+ 运算规则:
562+
563+ * 正数的左移与右移,空位补0
564+ * 负数原码的左移与右移,空位补0
565+ 负数反码的左移与右移,空位补1
566+ 负数补码,左移低位补0,右移高位补1
567+ * 无符号移位,空位补0
531568
532569
533570
@@ -2482,8 +2519,8 @@ abstract class Animal{
24822519| 本类中 | √ | √ | √ | √ |
24832520| 子类中 | X | √ | √ | √ |
24842521| 本包下其他类中 | X | √ | √ | √ |
2485- | 其他包下的类中 | X | X | X | √ |
24862522| 其他包下的子类中 | X | X | √ | √ |
2523+ | 其他包下的其他类中 | X | X | X | √ |
24872524
24882525protected 用于修饰成员,表示在继承体系中成员对于子类可见,子类需要重写方法才可以调用
24892526
@@ -2754,7 +2791,7 @@ public final class String implements java.io.Serializable, Comparable<String>, C
27542791```
27552792
27562793在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 `coder` 来标识使用了哪种编码。
2757- value 数组被声明为 final,这意味着 value 数组初始化之后就不能再引用其它数组,并且 String 内部没有改变 value 数组的方法,因此可以**保证 String 不可变**
2794+ value 数组被声明为 final,这意味着 value 数组初始化之后就不能再引用其它数组,并且 String 内部没有改变 value 数组的方法,因此可以**保证 String 不可变**,也保证线程安全
27582795
27592796**注意:不能改变的意思是每次更改字符串都会产生新的对象,并不是对原始对象进行改变**
27602797
@@ -3404,13 +3441,14 @@ public class SystemDemo {
34043441
34053442### BigDecimal
34063443
3407- 包:java.math.
3444+ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算
3445+
34083446构造方法:
34093447 `public static BigDecimal valueOf(double val)` : 包装浮点数成为大数据对象。
34103448 `public BigDecimal(double val)` :
34113449 `public BigDecimal(String val)` :
34123450
3413- 方法声明 :
3451+ 常用API :
34143452 `public BigDecimal add(BigDecimal value)` : 加法运算
34153453 `public BigDecimal subtract(BigDecimal value)` : 减法运算
34163454 `public BigDecimal multiply(BigDecimal value)` : 乘法运算
@@ -5317,7 +5355,33 @@ HashMap继承关系如下图所示:
53175355 ```java
53185356 this.threshold = tableSizeFor(initialCapacity);//initialCapacity=10
53195357 ```
5320-
5358+
5359+ * JDK11
5360+
5361+ ```java
5362+ static final int tableSizeFor(int cap) {
5363+ //无符号右移,高位补0
5364+ //-1补码: 11111111 11111111 11111111 11111111
5365+ int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1);
5366+ return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
5367+ }
5368+ //返回最高位之前的0的位数
5369+ public static int numberOfLeadingZeros(int i) {
5370+ if (i <= 0)
5371+ return i == 0 ? 32 : 0;
5372+ // 如果i>0,那么就表明在二进制表示中其至少有一位为1
5373+ int n = 31;
5374+ // i的最高位1在高16位,把i右移16位,让最高位1进入低16位继续递进判断
5375+ if (i >= 1 << 16) { n -= 16; i >>>= 16; }
5376+ if (i >= 1 << 8) { n -= 8; i >>>= 8; }
5377+ if (i >= 1 << 4) { n -= 4; i >>>= 4; }
5378+ if (i >= 1 << 2) { n -= 2; i >>>= 2; }
5379+ return n - (i >>> 1);
5380+ }
5381+ ```
5382+
5383+
5384+
532153854. resize
53225386
53235387 当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容。进行扩容,会伴随着一次重新hash分配,并且会遍历hash表中所有的元素,是非常耗时的,所以要尽量避免resize
@@ -9558,7 +9622,7 @@ public class UserServiceTest {
95589622
95599623
95609624
9561- ### 获取
9625+ ### 获取元素
95629626
95639627#### 获取类对象
95649628
@@ -9717,13 +9781,13 @@ public class TestStudent02 {
97179781
97189782Field的方法:给成员变量赋值和取值
97199783
9720- | 方法 | 作用 |
9721- | ---------------------------------- | ---------------------------------------------------- |
9722- | void set(Object obj, Object value) | 给对象注入某个成员变量数据,**obj是对象**,value是值 |
9723- | Object get(Object obj) | 获取对象的成员变量的值 ,**obj是对象** |
9724- | void setAccessible(true) | 暴力反射,设置为可以直接访问私有类型的属性 |
9725- | Class getType() | 获取属性的类型,返回Class对象 |
9726- | String getName() | 获取属性的名称 |
9784+ | 方法 | 作用 |
9785+ | ---------------------------------- | --------------------------------------------------------- |
9786+ | void set(Object obj, Object value) | 给对象注入某个成员变量数据,**obj是对象**,value是值 |
9787+ | Object get(Object obj) | 获取指定对象的成员变量的值 ,**obj是对象**,没有对象为null |
9788+ | void setAccessible(true) | 暴力反射,设置为可以直接访问私有类型的属性 |
9789+ | Class getType() | 获取属性的类型,返回Class对象 |
9790+ | String getName() | 获取属性的名称 |
97279791
97289792```Java
97299793public class FieldDemo {
@@ -11201,6 +11265,21 @@ JVM 内存结构规定了 Java 在运行过程中内存申请、分配、管理
1120111265
1120211266 
1120311267
11268+ 线程运行诊断:
11269+
11270+ * 定位:用top定位哪个进程对cpu的占用过高
11271+ * ps H -eo pid,tid,%cpu | grep 进程id (用ps命令进一步定位是哪个线程引起的cpu占用过高)
11272+ * jstack 进程id:可以根据线程id 找到有问题的线程,进一步定位到问题代码的源码行号
11273+
11274+ 常见OOM错误:
11275+
11276+ * java.lang.StackOverflowError
11277+ * java.lang.OutOfMemoryError:java heap space
11278+ * java.lang.OutOfMemoryError:GC overhead limit exceeeded
11279+ * java.lang.OutOfMemoryError:Direct buffer memory
11280+ * java.lang.OutOfMemoryError:unable to create new native thread
11281+ * java.lang.OutOfMemoryError:Metaspace
11282+
1120411283
1120511284
1120611285***
@@ -11243,12 +11322,7 @@ Java 虚拟机栈:Java Virtual Machine Stacks,**每个线程**运行时所
1124311322* 栈帧过多导致栈内存溢出 (超过了栈的容量),会抛出 OutOfMemoryError 异常
1124411323* 当线程请求的栈深度超过最大值,会抛出 StackOverflowError 异常
1124511324
11246- 线程运行诊断:
11247-
11248- * 定位:用top定位哪个进程对cpu的占用过高
11249- * ps H -eo pid,tid,%cpu | grep 进程id (用ps命令进一步定位是哪个线程引起的cpu占用过高)
1125011325
11251- * jstack 进程id:可以根据线程id 找到有问题的线程,进一步定位到问题代码的源码行号
1125211326
1125311327
1125411328
@@ -11510,9 +11584,9 @@ public class Demo1_27 {
1151011584
1151111585
1151211586
11587+ ***
1151311588
1151411589
11515- ***
1151611590
1151711591
1151811592
0 commit comments