12个常见的java面试题

50 阅读4分钟

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 字节,仅表示truefalse)。

3. 什么是封装、继承、多态?请分别举例说明

  • 封装:隐藏类的内部实现细节,仅通过公共方法暴露接口。例如:类的私有属性(private)通过getter/setter方法访问。
  • 继承:子类继承父类的属性和方法,实现代码复用。例如:Dog类继承Animal类,复用Animaleat()方法。
  • 多态:同一行为在不同对象上表现不同,包括编译时多态(方法重载)和运行时多态(方法重写)。例如:Animal a = new Dog(); a.eat(); 实际调用Dogeat()

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. 简述HashMapHashTable的区别

  • 线程安全HashTable是线程安全的(方法加synchronized),HashMap非线程安全(效率更高)。
  • 数据允许HashMap允许keyvaluenull(仅一个null key),HashTable不允许。
  • 底层实现:JDK8 后HashMap采用数组 + 链表 + 红黑树(链表长度 > 8 时转红黑树),HashTable始终为数组 + 链表。
  • 初始容量HashMap初始容量 16,HashTable初始容量 11;扩容机制不同(HashMap乘 2,HashTable乘 2+1)。

8. 什么是线程池?为什么要使用线程池?

  • 线程池是管理线程的容器,预先创建一定数量的线程,任务提交时直接使用现有线程,避免频繁创建 / 销毁线程的开销。

  • 优势:

    • 降低资源消耗(减少线程创建 / 销毁的性能损耗)。
    • 提高响应速度(任务无需等待线程创建)。
    • 便于管理(控制最大并发数,避免资源耗尽)。

9. 简述 Java 的垃圾回收机制(GC)的作用及常见回收算法

  • 作用:自动回收不再被引用的对象所占用的内存,避免内存泄漏。

  • 常见算法

    • 标记 - 清除:标记需回收对象,统一清除(会产生内存碎片)。
    • 标记 - 整理:标记后将存活对象移动到一端,清除另一端内存(解决碎片问题)。
    • 复制:将内存分为两块,仅使用一块,回收时复制存活对象到另一块(无碎片,适合对象存活率低的场景,如新生代)。
    • 分代收集:结合上述算法,新生代用复制算法,老年代用标记 - 清除 / 整理算法。

10. 什么是异常?Checked ExceptionUnchecked Exception的区别?

  • 异常:程序运行时的错误(如空指针、数组越界),Java 通过Throwable类及其子类(ExceptionError)处理。

  • 区别

    • Checked Exception(受检异常):编译时必须处理(捕获或声明抛出),如IOExceptionClassNotFoundException
    • Unchecked Exception(非受检异常):编译时无需处理,继承自RuntimeException,如NullPointerExceptionArrayIndexOutOfBoundsException

11. 什么是反射?反射有哪些应用场景?

  • 反射:在运行时动态获取类的信息(属性、方法、构造器等),并操作类或对象的方法。

  • 应用场景

    • 框架开发(如 Spring 的 IOC 容器通过反射创建对象)。
    • 动态代理(如 AOP 实现)。
    • 序列化 / 反序列化(如 JSON 解析工具通过反射映射对象)。

12. 什么是线程安全?如何保证线程安全?

  • 线程安全:多线程环境下,多个线程访问同一资源时,无需额外同步操作即可保证结果正确。

  • 保证方式

    • 使用synchronized关键字(同步方法 / 代码块)。
    • 使用java.util.concurrent包中的工具类(如ReentrantLockAtomicInteger)。
    • 避免共享可变资源(如使用局部变量而非成员变量)。
    • 采用不可变对象(如String,其值不可修改)。