1. 什么是 Java 的跨平台性?其实现原理是什么?
- 跨平台性指 Java 程序可在不同操作系统(如 Windows、Linux、macOS)上运行,无需修改代码。
- 实现原理:Java 源代码编译为字节码(.class 文件),通过不同平台的 Java 虚拟机(JVM)解释执行字节码,JVM 屏蔽了底层操作系统差异
2. 简述 Java 中的基本数据类型及其占用空间
-
Java 有 8 种基本数据类型:
- 整数类型:
byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节,声明时需加L后缀)。 - 浮点类型:
float(4 字节,声明时需加F后缀)、double(8 字节,默认浮点类型)。 - 字符类型:
char(2 字节,存储 Unicode 字符)。 - 布尔类型:
boolean(未明确规定,通常 1 字节,仅表示true或false)。
- 整数类型:
3. 什么是封装、继承、多态?请分别举例说明
- 封装:隐藏类的内部实现细节,仅通过公共方法暴露接口。例如:类的私有属性(
private)通过getter/setter方法访问。 - 继承:子类继承父类的属性和方法,实现代码复用。例如:
Dog类继承Animal类,复用Animal的eat()方法。 - 多态:同一行为在不同对象上表现不同,包括编译时多态(方法重载)和运行时多态(方法重写)。例如:
Animal a = new Dog(); a.eat();实际调用Dog的eat()。
4. 接口和抽象类的区别是什么?
| 维度 | 接口(Interface) | 抽象类(Abstract Class) |
|---|---|---|
| 继承关系 | 类可实现多个接口 | 类只能继承一个抽象类 |
| 方法实现 | 方法默认是public abstract(JDK8 + 可有默认方法) | 可包含抽象方法和具体方法 |
| 成员变量 | 只能是public static final常量 | 可包含各种修饰符的成员变量 |
| 构造方法 | 无 | 有(供子类调用) |
5. Java 中的==和equals()有什么区别?
==:比较基本数据类型时,比较值是否相等;比较引用数据类型时,比较内存地址是否相同(是否为同一对象)。equals():默认继承自Object类,本质是==(比较地址);但可重写(如String类重写后比较内容)。- 示例:
"abc" == new String("abc")为false(地址不同),但"abc".equals(new String("abc"))为true(内容相同)。
7. 简述HashMap和HashTable的区别
- 线程安全:
HashTable是线程安全的(方法加synchronized),HashMap非线程安全(效率更高)。 - 数据允许:
HashMap允许key或value为null(仅一个null key),HashTable不允许。 - 底层实现:JDK8 后
HashMap采用数组 + 链表 + 红黑树(链表长度 > 8 时转红黑树),HashTable始终为数组 + 链表。 - 初始容量:
HashMap初始容量 16,HashTable初始容量 11;扩容机制不同(HashMap乘 2,HashTable乘 2+1)。
8. 什么是线程池?为什么要使用线程池?
-
线程池是管理线程的容器,预先创建一定数量的线程,任务提交时直接使用现有线程,避免频繁创建 / 销毁线程的开销。
-
优势:
- 降低资源消耗(减少线程创建 / 销毁的性能损耗)。
- 提高响应速度(任务无需等待线程创建)。
- 便于管理(控制最大并发数,避免资源耗尽)。
9. 简述 Java 的垃圾回收机制(GC)的作用及常见回收算法
-
作用:自动回收不再被引用的对象所占用的内存,避免内存泄漏。
-
常见算法:
- 标记 - 清除:标记需回收对象,统一清除(会产生内存碎片)。
- 标记 - 整理:标记后将存活对象移动到一端,清除另一端内存(解决碎片问题)。
- 复制:将内存分为两块,仅使用一块,回收时复制存活对象到另一块(无碎片,适合对象存活率低的场景,如新生代)。
- 分代收集:结合上述算法,新生代用复制算法,老年代用标记 - 清除 / 整理算法。
10. 什么是异常?Checked Exception和Unchecked Exception的区别?
-
异常:程序运行时的错误(如空指针、数组越界),Java 通过
Throwable类及其子类(Exception和Error)处理。 -
区别:
Checked Exception(受检异常):编译时必须处理(捕获或声明抛出),如IOException、ClassNotFoundException。Unchecked Exception(非受检异常):编译时无需处理,继承自RuntimeException,如NullPointerException、ArrayIndexOutOfBoundsException。
11. 什么是反射?反射有哪些应用场景?
-
反射:在运行时动态获取类的信息(属性、方法、构造器等),并操作类或对象的方法。
-
应用场景:
- 框架开发(如 Spring 的 IOC 容器通过反射创建对象)。
- 动态代理(如 AOP 实现)。
- 序列化 / 反序列化(如 JSON 解析工具通过反射映射对象)。
12. 什么是线程安全?如何保证线程安全?
-
线程安全:多线程环境下,多个线程访问同一资源时,无需额外同步操作即可保证结果正确。
-
保证方式:
- 使用
synchronized关键字(同步方法 / 代码块)。 - 使用
java.util.concurrent包中的工具类(如ReentrantLock、AtomicInteger)。 - 避免共享可变资源(如使用局部变量而非成员变量)。
- 采用不可变对象(如
String,其值不可修改)。
- 使用