Skip to content

Commit b8a4337

Browse files
committed
Update Java Notes
1 parent bba0314 commit b8a4337

File tree

1 file changed

+17
-38
lines changed

1 file changed

+17
-38
lines changed

JavaSE.md

Lines changed: 17 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,9 +1652,9 @@ class Animal{
16521652

16531653
为了满足里式替换原则,重写有以下三个限制:
16541654

1655-
- 子类方法的访问权限必须大于等于父类方法
1656-
- 子类方法的返回类型必须是父类方法返回类型或为其子类型
1657-
- 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型
1655+
- 子类方法的访问权限必须大于等于父类方法
1656+
- 子类方法的返回类型必须是父类方法返回类型或为其子类型
1657+
- 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型
16581658

16591659
```java
16601660
public class ExtendsDemo {
@@ -4261,14 +4261,14 @@ LinkedList也是List的实现类:底层是**基于链表**的,增删比较
42614261
LinkedList是支持双链表,定位前后的元素是非常快的,增删首尾的元素也是最快的
42624262

42634263
LinkedList除了拥有List集合的全部功能还多了很多操作首尾元素的特殊功能:
4264-
`public void addFirst(E e)` : 将指定元素插入此列表的开头
4265-
`public void addLast(E e)` : 将指定元素添加到此列表的结尾
4266-
`public E getFirst()` : 返回此列表的第一个元素
4267-
`public E getLast()` : 返回此列表的最后一个元素
4268-
`public E removeFirst()` : 移除并返回此列表的第一个元素
4269-
`public E removeLast()` : 移除并返回此列表的最后一个元素
4270-
`public E pop()` : 从此列表所表示的堆栈处弹出一个元素
4271-
`public void push(E e)` : 将元素推入此列表所表示的堆栈
4264+
`public void addFirst(E e)` : 将指定元素插入此列表的开头
4265+
`public void addLast(E e)` : 将指定元素添加到此列表的结尾
4266+
`public E getFirst()` : 返回此列表的第一个元素
4267+
`public E getLast()` : 返回此列表的最后一个元素
4268+
`public E removeFirst()` : 移除并返回此列表的第一个元素
4269+
`public E removeLast()` : 移除并返回此列表的最后一个元素
4270+
`public E pop()` : 从此列表所表示的堆栈处弹出一个元素
4271+
`public void push(E e)` : 将元素推入此列表所表示的堆栈
42724272

42734273
```java
42744274
public class ListDemo {
@@ -12691,11 +12691,11 @@ public class Demo {
1269112691
28: return
1269212692
```
1269312693

12694-
* new 是创建对象,给对象分配堆内存,执行成功会将**对象引用**压入操作数栈
12694+
* new 是在堆中创建对象,执行成功会将**对象引用**压入操作数栈
1269512695

12696-
* dup 是赋值操作数栈栈顶的内容,本例即为**对象引用**(对象在堆内),为什么需要两份引用呢?
12696+
* dup 是复制操作数栈栈顶的内容,本例即为**对象引用**,为什么需要两份引用呢?
1269712697

12698-
* 一个要配合 invokespecial 调用该对象的构造方法 "<init>":()V (会消耗掉栈顶一个引用)
12698+
* 一个要配合 invokespecial 调用该对象的构造方法 <init>:()V (会消耗掉栈顶一个引用)
1269912699

1270012700
* 一个要配合 astore_1 赋值给局部变量
1270112701

@@ -13561,7 +13561,7 @@ Java对象创建时机:
1356113561

1356213562
##### 生命周期
1356313563

13564-
类是在运行期间第一次使用时动态加载的,而不是一次性加载所有类,因为一次性加载会占用很多的内存
13564+
类是在运行期间**第一次使用时动态加载**的(不使用不加载),而不是一次性加载所有类,因为一次性加载会占用很多的内存
1356513565

1356613566
![](https://gitee.com/seazean/images/raw/master/JavaSE/JVM-类的生命周期.png)
1356713567

@@ -13590,7 +13590,7 @@ Java对象创建时机:
1359013590

1359113591
##### 加载
1359213592

13593-
加载是类加载的一个阶段,注意不要混淆
13593+
加载是类加载的一个阶段,注意不要混淆
1359413594

1359513595
加载过程完成以下三件事:
1359613596

@@ -14033,7 +14033,7 @@ JVM 将执行状态分成了 5 个层次:
1403314033
即时编译器(JIT)与解释器的区别:
1403414034

1403514035
* 解释器是将字节码解释为机器码,下次即使遇到相同的字节码,仍会执行重复的解释
14036-
* JIT 是将一些字节码编译为机器码,并存入 Code Cache,下次遇到相同的代码,直接执行,无需再编译
14036+
* JIT 是将一些字节码编译为机器码,并存入**Code Cache**,下次遇到相同的代码,直接执行,无需再编译
1403714037
* 解释器是将字节码解释为针对所有平台都通用的机器码
1403814038
* JIT 会根据平台类型,生成平台特定的机器码
1403914039

@@ -14211,27 +14211,6 @@ JDK 自带了监控工具,位于 JDK 的 bin 目录下,其中最常用的是
1421114211

1421214212

1421314213

14214-
***
14215-
14216-
14217-
14218-
## JMM
14219-
14220-
Java 内存模型是 Java MemoryModel(JMM)
14221-
14222-
JMM主要是为了规定了线程和内存之间的一些关系,根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都存储在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成
14223-
14224-
![](https://gitee.com/seazean/images/raw/master/JavaSE/JMM内存模型.png)
14225-
14226-
**jvm和jmm之间的关系**:
14227-
14228-
* jmm中的主内存、工作内存与jvm中的Java堆、栈、方法区等并不是同一个层次的内存划分
14229-
* 这两者基本上是没有关系的,如果两者一定要勉强对应起来,那从变量、主内存、工作内存的定义来看:
14230-
* 主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域
14231-
* 从更低层次上说,主内存就直接对应于物理硬件的内存,而为了获取更好的运行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要访问读写的是工作内存
14232-
14233-
14234-
1423514214

1423614215

1423714216
***

0 commit comments

Comments
 (0)