让你的JVM更加强大
我们现在把这些东西研究得这么细,对于我们后面学习JVM的编译系统是非常有帮助的
关系运算符 重点讲
C语言是如何做关系运算的
一、int比较
特殊指令
代码顺序影响指令生成
二、与0做比较
三、其他数据类型的比较
四、引用类型比较
1、正常情况
public class IfNull {
public static void test() {
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1 == o2);
}
}
1、JVM如何判断是否为null
专属指令
专属指令的好处:节省栈空间
public class IfNull {
public static void ifNull() {
Object obj = null;
if (null == obj) {
System.out.println("null");
} else {
System.out.println("not null");
}
}
public static void ifNonNull() {
Object obj = null;
if (null != obj) {
System.out.println("null");
} else {
System.out.println("not null");
}
}
}
2、专属指令受代码顺序的影响
public class IfNull {
public static void main(String[] args) {
Object obj = null;
System.out.println(obj == null);
System.out.println(null == obj);
}
}
逻辑运算符 重点讲
增强for循环 重点讲
通过这个案例也能让大家知晓数组是如何实现的
public static void test2() {
byte[] arr = {1, 2};
for (byte b: arr) {
System.out.println(b);
}
}
0 iconst_2
1、将2压入操作数栈(数组长度)
1 newarray 8 (byte)
1、创建基本类型的数组(8是数组元素类型)
2、将数组对象指针压入栈
3 dup
1、复制栈顶元素
2、再次压入栈
4 iconst_0
1、将0压入栈(第一个元素的index)
5 iconst_1
1、将1压入栈(第一个元素的value)
6 bastore
1、完成数组index=0的元素赋值1
会取出栈顶的三个Slot
这步执行完栈中只剩数组对象指针
7 dup
8 iconst_1
9 iconst_2
10 bastore
1、完成数组index=1的元素赋值2
会取出栈顶的三个Slot
这步执行完栈中只剩数组对象指针
11 astore_0
1、pop出栈顶元素
2、赋值给局部变量表中index=0的位置
12 aload_0
1、取出局部变量表中index=0位置的元素(数组指针)
2、压入栈
13 astore_1
1、pop出栈顶元素
2、赋值给局部变量表中index=1的位置
14 aload_1
1、取出局部变量表中index=1位置的元素(数组指针)
2、压入栈
15 arraylength
1、取出栈顶元素
2、压入栈
16 istore_2
1、取出栈顶元素(数组长度)
2、存储到局部变量表中index=2的位置
17 iconst_0
1、将0压入操作数栈
18 istore_3
1、取出栈顶元素
2、存储到局部变量表中index=3的位置
19 iload_3
1、取出局部变量表中index=3位置的元素(数组的起始index,即0)
2、压入栈
20 iload_2
1、取出局部变量表中index=2位置的元素(数组的长度)
2、压入栈
21 if_icmpge 43 (+22)
1、取出栈顶两个元素进行比较
前者大于等于后者时跳转
24 aload_1
1、取出局部变量表中index=1位置的元素(数组指针)
2、压入栈
25 iload_3
1、取出局部变量表中index=3位置的元素(数组的访问index)
2、压入栈
26 baload
1、取出数组元素(index=0)
2、压入栈
27 istore 4
1、取出栈顶元素(等下要输出的数值)
2、存储到局部变量表index=4的位置
29 getstatic #3 <java/lang/System.out>
32 iload 4
34 invokevirtual #4 <java/io/PrintStream.println>
37 iinc 3 by 1
40 goto 19 (-21)
43 return
堆栈图:https://www.processon.com/view/link/6115dc0ce0b34d0b1a54447a
三目运算符
课堂细讲
循环结构
条件语句
课堂细讲
练习
1、实现课堂上讲到的所有相关指令
2、实现数组、增强for循环
3、让你的JVM支持跨方法调用