阿里孤尽大神 怎么记笔记:

知识快速进入 搜集区,包括书上的、听到的、看到的、疑惑的;不断地去思考、复核并总结之后,沉淀在 整理区。这是 点维度 的总结;把这些点的知识串成个 专题线维度 的总结;而最后的知识上升到 哲学方法论 级别,是 面维度 的总结。

第 4 章 走进 JVM

####4.1 字节码

Java 所有的指令有200个左右,一个字节(8位)可以存储256种不同的指令信息,一个这样的字节称为字节码(Bytecode)。

  • 字节码主要指令:

    1. 加载或存储指令

      1. 将局部变量加载到操作栈中。如 ILOAD(将int 类型的局部变量压入栈) 和 ALOAD(将对象引用的局部变量压入栈)等。
      2. 从操作栈顶存储到局部变量表。如 ISTORE、ASTORE 等。
      3. 将常量加载到操作栈顶,这是极为高频使用的指令。如 ICONST、BIPUSH、SIPUSH、LDC 等。
    2. 运算指令

      对两个操作栈帧上的值进行运算,并把结果写入操作栈顶,如 IADD、IMUL 等。

    3. 类型转换指令

      显式转换两种不同的数值类型。如 I2L、D2F 等。

    4. 对象创建与访问指令

      根据类进行对象的创建、初始化、方法调用相关的指令,常见指令如下:

      1. 创建对象指令。如 NEW、NEWARRAY 等。
      2. 访问属性指令。如 GETFIELD、PUTFIELD、GETSTATIC 等。
      3. 检查实例类型指令。如 INSTANCEOF、CHECKCAST 等。
    5. 操作栈管理指令

      JVM 提供了直接控制操作栈的指令,常见指令如下:

      1. 出栈操作。如POP 即一个元素,POP2 即两个元素。
      2. 复制栈顶元素并压入栈。如 DUP。
    6. 方法调用与返回指令

      常见指令如下:

      1. INVOKEVIRTUAL 指令:调用对象的实例方法。
      2. INVOKESPECIAL 指令:调用实例初始化方法、私有方法、父类方法等。
      3. INVOKESTATIC 指令:调用类静态方法。
      4. RETURN 指令:返回VOID 类型。
    7. 同步指令

      JVM 使用方法结构中的 ACC_SYNCHRONIZED 标记同步方法,指令集中有 MONITORENTER 和 MONITOREXIT 支持 synchronized 语义。

4.2 类加载过程

在冯 诺依曼 定义的的计算机模型中,任何程序都需要加载到内存才能与CPU 进行交流。字节码.class 文件同样需要加载到内存中,才可以实例化类。ClassLoader 的使命就是提前加载 .class 类文件到内存中。

Java 的类加载器是一个运行时核心基础设施模块,主要是在启动之初进行类的Load、Link 和 Lnit,即加载、链接、初始化。

  1. 第一步

第六章有点看不懂

  • 平衡二叉树

    为什么需要平衡二叉树,如果有些树的结构和链表差不多,这样表示的话,就不能充分利用树的特性,为了让像链表一样的树更有次数结构,这时候就需要转换为平衡二叉树。

    • 树的左右高度差不能小于1
    • 任何向下递归的左子树与右子树,必须符合第一条性质
    • 没有任何节点的空树或只有根节点的树也是平衡二叉树
  • 二叉查找树

    • 又称为 二叉搜索树 ,即 Binary Search Tree ,其中 Search 也可以替换为 Sort,所以也称为 二叉排序树
    • 对于任意节点来说,它的左子树上所有节点的值都小于它,而它的右子树上所有节点的值都大于它。
    • 遍历的方式通常有三种:前序遍历、中序遍历、后序遍历。
      • 在任何递归子树中,左节点一定在右节点之前先遍历
      • 前序、中序、后序,仅指 根节点 在遍历时的位置顺序。
  • AVL 树 是一种 平衡二叉查找树,增加和删除节点后通过树形旋转重新达到平衡。

    • 左旋:以某个节点为中心,将它沉入当前左子节点的位置,而让它当前的右节点作为新树的根节点,也称为逆时针旋转。
    • 右旋:以某个节点为中心,将它沉入当前右子节点的位置,而让它当前的左节点作为新树的根节点,也称为顺时针旋转。
  • 红黑树 主要特征是在每个节点上增加一个属性来表示节点的颜色,可以是红色,也可以是黑色。

    • 不用保证每个递归子树的高度差不超过1,而是保证从根节点到叶子节点的最长路径不超过最短路径的2倍,所以它的最坏运行时间也是 O(log n)。
    • 5个约束条件
      1. 节点只能是红色或黑色。
      2. 根节点必须是黑色。
      3. 所有 NIL 节点都是黑色的。 NIL,即叶子节点下挂的两个虚节点。
      4. 一条路径上不能出现相邻的两个红色节点。
      5. 在任何递归子树上,根节点到叶子节点的所有路径上包含相同数目的黑色节点。