让你的JVM更加强大

我们现在把这些东西研究得这么细,对于我们后面学习JVM的编译系统是非常有帮助的

关系运算符 重点讲

image.png

C语言是如何做关系运算的

一、int比较

特殊指令
代码顺序影响指令生成

二、与0做比较

三、其他数据类型的比较

四、引用类型比较

1、正常情况
image.png

  1. public class IfNull {
  2. public static void test() {
  3. Object o1 = new Object();
  4. Object o2 = new Object();
  5. System.out.println(o1 == o2);
  6. }
  7. }

1、JVM如何判断是否为null
专属指令
专属指令的好处:节省栈空间
image.png

  1. public class IfNull {
  2. public static void ifNull() {
  3. Object obj = null;
  4. if (null == obj) {
  5. System.out.println("null");
  6. } else {
  7. System.out.println("not null");
  8. }
  9. }
  10. public static void ifNonNull() {
  11. Object obj = null;
  12. if (null != obj) {
  13. System.out.println("null");
  14. } else {
  15. System.out.println("not null");
  16. }
  17. }
  18. }

2、专属指令受代码顺序的影响

  1. public class IfNull {
  2. public static void main(String[] args) {
  3. Object obj = null;
  4. System.out.println(obj == null);
  5. System.out.println(null == obj);
  6. }
  7. }

逻辑运算符 重点讲

image.png

增强for循环 重点讲

通过这个案例也能让大家知晓数组是如何实现的

  1. public static void test2() {
  2. byte[] arr = {1, 2};
  3. for (byte b: arr) {
  4. System.out.println(b);
  5. }
  6. }
  7. 0 iconst_2
  8. 1、将2压入操作数栈(数组长度)
  9. 1 newarray 8 (byte)
  10. 1、创建基本类型的数组(8是数组元素类型)
  11. 2、将数组对象指针压入栈
  12. 3 dup
  13. 1、复制栈顶元素
  14. 2、再次压入栈
  15. 4 iconst_0
  16. 1、将0压入栈(第一个元素的index
  17. 5 iconst_1
  18. 1、将1压入栈(第一个元素的value
  19. 6 bastore
  20. 1、完成数组index=0的元素赋值1
  21. 会取出栈顶的三个Slot
  22. 这步执行完栈中只剩数组对象指针
  23. 7 dup
  24. 8 iconst_1
  25. 9 iconst_2
  26. 10 bastore
  27. 1、完成数组index=1的元素赋值2
  28. 会取出栈顶的三个Slot
  29. 这步执行完栈中只剩数组对象指针
  30. 11 astore_0
  31. 1pop出栈顶元素
  32. 2、赋值给局部变量表中index=0的位置
  33. 12 aload_0
  34. 1、取出局部变量表中index=0位置的元素(数组指针)
  35. 2、压入栈
  36. 13 astore_1
  37. 1pop出栈顶元素
  38. 2、赋值给局部变量表中index=1的位置
  39. 14 aload_1
  40. 1、取出局部变量表中index=1位置的元素(数组指针)
  41. 2、压入栈
  42. 15 arraylength
  43. 1、取出栈顶元素
  44. 2、压入栈
  45. 16 istore_2
  46. 1、取出栈顶元素(数组长度)
  47. 2、存储到局部变量表中index=2的位置
  48. 17 iconst_0
  49. 1、将0压入操作数栈
  50. 18 istore_3
  51. 1、取出栈顶元素
  52. 2、存储到局部变量表中index=3的位置
  53. 19 iload_3
  54. 1、取出局部变量表中index=3位置的元素(数组的起始index,即0
  55. 2、压入栈
  56. 20 iload_2
  57. 1、取出局部变量表中index=2位置的元素(数组的长度)
  58. 2、压入栈
  59. 21 if_icmpge 43 (+22)
  60. 1、取出栈顶两个元素进行比较
  61. 前者大于等于后者时跳转
  62. 24 aload_1
  63. 1、取出局部变量表中index=1位置的元素(数组指针)
  64. 2、压入栈
  65. 25 iload_3
  66. 1、取出局部变量表中index=3位置的元素(数组的访问index
  67. 2、压入栈
  68. 26 baload
  69. 1、取出数组元素(index=0
  70. 2、压入栈
  71. 27 istore 4
  72. 1、取出栈顶元素(等下要输出的数值)
  73. 2、存储到局部变量表index=4的位置
  74. 29 getstatic #3 <java/lang/System.out>
  75. 32 iload 4
  76. 34 invokevirtual #4 <java/io/PrintStream.println>
  77. 37 iinc 3 by 1
  78. 40 goto 19 (-21)
  79. 43 return

堆栈图:https://www.processon.com/view/link/6115dc0ce0b34d0b1a54447a

三目运算符

课堂细讲

循环结构

课堂细讲

条件语句

课堂细讲

练习

1、实现课堂上讲到的所有相关指令
2、实现数组、增强for循环
3、让你的JVM支持跨方法调用