1. 经典算法题:多条件排序

问题描述: 有一个学生类 Student(包含分数 score 和学号 id),如何实现:先按分数排序(假设从高到低),分数相同的再按学号排序(从小到大)?

面试回答思路: 这道题考的是你对 Java 比较器 (Comparator) 的使用,特别是 Java 8 的链式写法。

  • 方法一:传统写法 (匿名内部类)

    • 实现 Comparator 接口。

    • compare 方法里写 if-else 逻辑:先比分数,分数不一样直接返回结果;分数一样,再比学号。

  • 方法二:Java 8 链式写法 (面试加分项)

    • 利用 Comparator.comparing()thenComparing()

    • 代码极简,逻辑清晰。

代码示例 (背诵这个):

// 假设 list 是 List<Student>
list.sort(Comparator.comparing(Student::getScore).reversed() // 第一规则:按分数倒序 (高到低)
        .thenComparing(Student::getId));                     // 第二规则:按学号正序 (小到大)

2. Native 方法是什么?

问题描述: 解释一下 Java 中的 native 关键字。

核心考点:

  • 定义: native 修饰的方法是一个本地方法。意思是:这个方法的方法体不是用 Java 写的,而是用 C 或 C++ 写的。

  • 机制: 它依赖于 JNI (Java Native Interface) 机制。Java 调用这个方法时,底层会去调用 DLL (Windows) 或 .so (Linux) 动态链接库中的 C/C++ 代码。

  • 为什么要有它?

    1. 操作硬件/系统底层: Java 是运行在虚拟机上的,离操作系统隔了一层,有些底层的活(比如驱动硬件、管理内存、精确的系统调用)Java 干不了,必须找 C/C++ 帮忙。

    2. 性能: 对于极度追求效率的计算密集型任务,C++ 可能比 Java 快。

  • 常见例子:

    • Object.getClass()

    • Object.hashCode()

    • System.arraycopy()

    • Thread.start0() (启动线程的底层实现)