Skip to content

Commit 745f14a

Browse files
committed
Update Java Notes
1 parent f47a0a0 commit 745f14a

File tree

3 files changed

+356
-263
lines changed

3 files changed

+356
-263
lines changed

Frame.md

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10892,13 +10892,27 @@ ExceptionHandler注解:
1089210892

1089310893
### Rest概述
1089410894

10895-
Rest (Representational State Transfer):一种网络资源的访问风格,定义了网络资源的访问方式
10895+
Rest (REpresentational State Transfer):表现层状态转化,定义了**资源”在网络传输中以某种“表现形式”进行“状态转移**,即网络资源的访问方式
10896+
10897+
* 资源:把真实的对象数据称为资源,一个资源既可以是一个集合,也可以是单个个体;每一种资源都有特定的 URI(统一资源标识符)与之对应,如果获取这个资源,访问这个 URI 就可以,比如获取特定的班级`/class/12`;资源也可以包含子资源,比如 `/classes/classId/teachers`某个指定班级的所有老师
10898+
* 表现形式:"资源"是一种信息实体,它可以有多种外在表现形式,把"资源"具体呈现出来的形式比如 json、xml、image、txt 等等叫做它的"表现层/表现形式"
10899+
* 状态转移:描述的服务器端资源的状态,比如增删改查(通过 HTTP 动词实现)引起资源状态的改变,互联网通信协议 HTTP 协议,是一个**无状态协议**,所有的资源状态都保存在服务器端
10900+
10901+
10902+
10903+
***
1089610904

10897-
* 传统风格访问路径:http://localhost/user/get?id=1
10898-
* Rest风格访问路径:http://localhost/user/1
10905+
10906+
10907+
### Restful
10908+
10909+
#### 风格
1089910910

1090010911
Restful是按照Rest风格访问网络资源
1090110912

10913+
* 传统风格访问路径:http://localhost/user/get?id=1
10914+
* Rest风格访问路径:http://localhost/user/1
10915+
1090210916
优点:隐藏资源的访问行为,通过地址无法得知做的是何种操作,书写简化
1090310917

1090410918
Rest行为约定方式:
@@ -10915,11 +10929,9 @@ Rest行为约定方式:
1091510929

1091610930

1091710931

10918-
***
10919-
1092010932

1092110933

10922-
### Restful
10934+
#### 开发
1092310935

1092410936
Restful请求路径简化配置方式:@RestController = @Controller + @ResponseBody
1092510937

@@ -10941,29 +10953,28 @@ Restful请求路径简化配置方式:@RestController = @Controller + @Respons
1094110953

1094210954
代码实现:
1094310955

10944-
* restful.jsp
10945-
页面表单使用隐藏域提交请求类型,参数名称固定为_method,必须配合提交类型method=post使用
10956+
* restful.jsp:
1094610957

10947-
* GET请求通过地址栏可以发送,也可以通过设置form的请求方式提交
10958+
* 页面表单使用隐藏域提交请求类型,参数名称固定为_method,必须配合提交类型method=post使用
10959+
10960+
* GET请求通过地址栏可以发送,也可以通过设置form的请求方式提交
1094810961
* POST请求必须通过form的请求方式提交
1094910962

10950-
```html
10963+
```html
1095110964
<%@page pageEncoding="UTF-8" language="java" contentType="text/html;UTF-8" %>
1095210965
<h1>restful风格请求表单</h1>
1095310966
<%--切换请求路径为restful风格--%>
1095410967
<form action="/user/1" method="post">
10955-
<%--当添加了name为_method的隐藏域时,可以通过设置该隐藏域的值,修改请求的提交方式,切换为PUT请求或DELETE请求,但是form表单的提交方式method属性必须填写post--%>
10956-
<input type="text" name="_method" value="PUT"/>
10957-
<input type="submit"/>
10968+
<%--当添加了name为_method的隐藏域时,通过设置该隐藏域的值,修改请求的提交方式--%>
10969+
<%--切换为PUT请求或DELETE请求,但是form表单的提交方式method属性必须填写post--%>
10970+
<input type="text" name="_method" value="PUT"/>
10971+
<input type="submit"/>
1095810972
</form>
10959-
```
10960-
10961-
10973+
```
10974+
1096210975
* java / controller / UserController
1096310976

1096410977
```java
10965-
//@Controller
10966-
//@ResponseBody
1096710978
//设置rest风格的控制器
1096810979
@RestController
1096910980
//设置公共访问路径,配合下方访问路径使用
@@ -11036,7 +11047,7 @@ Restful请求路径简化配置方式:@RestController = @Controller + @Respons
1103611047
<servlet-name>DispatcherServlet</servlet-name>
1103711048
</filter-mapping>
1103811049
```
11039-
11050+
1104011051

1104111052

1104211053

JavaSE.md

Lines changed: 99 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,14 @@ new Integer(123) 与 Integer.valueOf(123) 的区别在于:
267267

268268
valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。编译器会在自动装箱过程调用 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

24882525
protected 用于修饰成员,表示在继承体系中成员对于子类可见,子类需要重写方法才可以调用
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+
53215385
4. 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

97189782
Field的方法:给成员变量赋值和取值
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
97299793
public class FieldDemo {
@@ -11201,6 +11265,21 @@ JVM 内存结构规定了 Java 在运行过程中内存申请、分配、管理
1120111265

1120211266
![](https://gitee.com/seazean/images/raw/master/JavaSE/JVM-Java8内存结构图.png)
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

Comments
 (0)