Java核心概念与常见面试问题解析
equals()与hashCode()的关系
若两个对象通过equals()比较结果为true,则它们的hashCode()返回值必定相同。
然而,hashCode()相等并不意味着equals()一定返回true,因此仅依赖hashCode()进行比较并不可靠。
Java类的初始化顺序
Java类的加载和初始化遵循特定顺序:
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类实例变量
- 父类实例代码块
- 父类构造方法
- 子类实例变量
- 子类实例代码块
- 子类构造方法
Java跨平台特性的本质
Java的跨平台能力源于JVM(Java虚拟机),它能够执行编译后的.class字节码文件,而非直接运行.java源文件。
数组复制方法性能对比
不同复制方式的效率排序为:System.arraycopy > clone > Arrays.copyOf > for循环
Object类的核心方法
抽象类与接口的访问权限演变
抽象类方法权限:
- JDK 1.8之前:默认为protected
- JDK 1.8及以后:默认为包访问权限(default)
接口方法权限:
- JDK 1.8之前:必须为public
- JDK 1.8:支持public和default方法
- JDK 1.9:新增private方法支持
变量初始化规则
以下代码无法通过编译:
public class Example {
public static void main(String[] args) {
String s;
System.out.println("s=" + s); // 编译错误:变量s未初始化
}
}
局部变量必须在使用前显式初始化,而类成员变量会获得默认值。
异常分类体系
- Error:虚拟机级别的严重错误,通常无需应用程序处理
- Exception:应用程序可处理的异常情况
- 检查异常:编译器强制要求处理的异常(除RuntimeException及其子类外)
- 非检查异常:包括RuntimeException和Error
for循环执行机制
标准for循环的执行流程:
for(初始化表达式; 条件表达式; 更新表达式) {
循环体;
}
- 首次执行:初始化→条件判断→循环体→更新表达式
- 后续执行:条件判断→循环体→更新表达式
程序终止条件
JRE判定程序执行结束的标准是所有非守护线程执行完毕。
Java继承机制实现方式
Java通过以下方式实现类似多重继承的效果:
- 实现多个接口
- 继承一个类并实现多个接口
- 使用内部类继承其他类
变量初始化策略
- 静态变量:自动获得默认值
- 局部变量:必须手动初始化
- final变量:必须显式赋值
接口成员特性
- 方法默认为public abstract
- 变量默认为public static final
- JDK 1.8+支持default和static方法
常见运行时异常
- NullPointerException:对象引用未初始化
- NumberFormatException:数值格式转换失败
- ArrayIndexOutOfBoundsException:数组索引越界
JVM内存区域划分
- 线程私有:虚拟机栈、程序计数器、本地方法栈
- 线程共享:堆内存、方法区
Vector与ArrayList对比
| 特性 | Vector | ArrayList |
|---|---|---|
| 线程安全性 | 同步(线程安全) | 非同步(线程不安全) |
| 容量增长 | 100%增长 | 50%增长 |
Java程序执行流程
- 源码编译为字节码(.class文件)
- 字节码加载至JVM
- 执行引擎转换为机器码
- 操作系统执行机器码
可中断方法列表
- Object.wait()
- Thread.sleep()
- Thread.join()
类初始化完整顺序
- 父类静态代码块
- 子类静态代码块
- 父类实例代码块
- 父类构造方法
- 子类实例代码块
- 子类构造方法
MVC模式优势分析
采用MVC架构的优势包括:
- 高可维护性
- 良好可扩展性
- 代码复用率高
但并不会显著减少代码总量。
垃圾回收机制
数据库驱动加载方式
// 方式一
Class.forName("com.mysql.cj.jdbc.Driver");
// 方式二
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
// 方式三
System.setProperty("jdbc.drivers", "com.mysql.cj.jdbc.Driver");
常用ASCII码值参考
- 空格:32
- 字符'0':48
- 大写字母'A':65
- 小写字母'a':97
构造方法调用规则
子类构造方法执行前必然调用父类构造方法:
- 默认调用父类无参构造方法
- 若父类无无参构造方法,子类必须显式调用super()
Java集合框架结构
JDK工具集功能
- javac:编译源代码
- java:启动JVM执行程序
- javadoc:生成API文档
- jar:打包工具
- jdb:调试器
Servlet生命周期
- 初始化:init()方法
- 服务:service()方法
- 销毁:destroy()方法