Java 基础面试题精选:从语法到集合,高频问题解析

Java 基础面试题精选:从语法到集合(2025-2026 高频真实考点)

以下内容按出现频率从高到低排列,覆盖了几乎所有大厂(阿里、字节、腾讯、美团、京东、华为、拼多多等)Java 后端/后端实习/校招一面、二面最常问的基础题目。

一、基础语法与 JVM 内存相关(最常考前 10 题)

  1. Java 中基本数据类型和引用数据类型有哪些?各自默认值是多少? 回答要点:
  • 基本类型(8种):byte(0)、short(0)、int(0)、long(0L)、float(0.0f)、double(0.0)、char()、boolean(false)
  • 引用类型:类、接口、数组、String、包装类等,默认值 null
  1. == 和 equals() 的区别?String 为什么可以直接用 == 比较? 高频追问:
  • == 比较的是内存地址(基本类型比值,引用类型比地址)
  • equals() 默认也是比地址,但 String、Integer 等重写了 equals(),实现值比较
  • String s1 = “hello”; String s2 = “hello”; → s1 == s2 为 true(字符串常量池)
  1. String、StringBuilder、StringBuffer 的区别? 特性 String StringBuilder StringBuffer 是否可变 不可变 可变 可变 线程安全 是(不可变) 否 是(方法加 synchronized) 性能 — 最快 较慢 使用场景 常量、少量拼接 单线程大量拼接 多线程拼接 面试结论:日常 99% 用 StringBuilder,除非明确多线程场景才考虑 StringBuffer。
  2. final、finally、finalize 的区别?
  • final:修饰类(不可继承)、方法(不可重写)、变量(不可修改,基本类型值不变,引用类型地址不变)
  • finally:try-catch 块中必定执行的代码块(即使 return、throw 也会执行)
  • finalize:Object 类方法,GC 前可能调用(已过时,Java 9 标记 deprecated)
  1. 重载(Overload)和重写(Override)的区别? 维度 重载(Overload) 重写(Override) 位置 同一个类 子类 方法名 相同 相同 参数列表 不同(数量/类型/顺序) 相同 返回值 可不同 相同或协变类型(Java 5+) 异常 可不同 更窄或相同 访问修饰符 可不同 更宽松或相同
  2. 抽象类和接口的区别?(Java 8 后变化很大) 特性 抽象类 接口(Java 8+) 成员变量 可以有普通变量 只能有 public static final 方法 可以有抽象+非抽象方法 默认方法、静态方法、私有方法 构造方法 可以有 没有 继承/实现 单继承 多实现 使用场景 模板方法、代码复用 功能扩展、行为约定 现在面试常问:“为什么 Java 8 后接口可以有 default 方法?”
    答:为了在不破坏已有实现类的情况下扩展接口功能(典型例子:Collection.sort()、Stream API)。

二、面向对象高频题

  1. 构造方法的作用?能否被继承?能否被重载?
  • 作用:初始化对象、给成员变量赋初值
  • 不能被继承(但子类会隐式调用父类无参构造)
  • 可以被重载(多个构造方法)
  1. this 和 super 的作用?
  • this:指代当前对象(this.属性、this.方法、this() 调用本类其他构造)
  • super:指代父类对象(super.属性/方法、super() 调用父类构造)
  1. Java 中多态的体现?
  • 父类引用指向子类对象
  • 方法重写(运行时绑定)
  • 接口实现
  • 向上转型(自动)、向下转型(需强转)

三、集合框架(Collection & Map)高频题

  1. ArrayList 和 LinkedList 的区别?底层实现?适用场景? 项目 ArrayList LinkedList 底层结构 动态数组 双向链表 随机访问 O(1) O(n) 插入/删除 O(n)(需移动元素) O(1)(改指针) 内存占用 较连续,较低 每个节点有 prev/next,较高 适用场景 查询多、尾部增删 头部/中间频繁增删、队列/栈
  2. HashMap 底层原理(JDK 1.8)?为什么 1.8 改用红黑树? 核心回答:
    • JDK 1.7:数组 + 单向链表
    • JDK 1.8:数组 + 链表(长度>8 转为红黑树)+ 扩容优化
    • 为什么用红黑树?链表过长查询退化成 O(n),红黑树保证最坏 O(log n)
    • 扩容时机:size > capacity × loadFactor(默认 0.75)
    • hash 计算:(h = key.hashCode()) ^ (h >>> 16) 高低位异或,减少碰撞
  3. HashMap 为什么线程不安全?ConcurrentHashMap 如何实现线程安全?
    • HashMap 不安全原因:put 时多线程扩容可能死循环(1.7)、数据覆盖丢失(1.8)
    • ConcurrentHashMap(1.8):
    • 数组 + 链表/红黑树
    • 采用 CAS + synchronized 细粒度锁
    • 扩容时多线程协助扩容
    • size 用 volatile + 分段计数
  4. HashSet 如何保证不重复?底层实现?
    • 底层基于 HashMap,key 存元素,value 存常量对象
    • add() → put() → hashCode() + equals() 双重判断
  5. TreeMap / TreeSet 底层是什么?为什么有序?
    • 底层红黑树
    • 按照 key 的自然顺序或 Comparator 排序

四、异常处理 & 其他高频

  1. throw 和 throws 的区别? 项目 throw throws 位置 方法体内 方法声明后 作用 手动抛出异常对象 声明方法可能抛出的异常 后跟内容 new XXXException(…) 异常类名(可多个,用逗号隔)
  2. Error 和 Exception 的区别?常见子类?
    • Error:严重问题(OutOfMemoryError、StackOverflowError),程序无法恢复
    • Exception:可捕获、可恢复(RuntimeException + 受检异常)
    • RuntimeException:空指针、数组越界、类型转换、除零等(非受检)
    • 受检异常:IOException、SQLException 等(必须处理)

五、2025-2026 年新增/变热的高频基础题

  1. record 关键字(Java 16+)是什么?解决了什么问题? 答:不可变数据载体,自动生成构造器、getter、equals、hashCode、toString,极大减少样板代码。
    常用于 DTO、VO、配置类。
  2. switch 表达式(Java 14+ → 21 完善)与传统 switch 的区别? 答:支持箭头语法(->)、yield 返回值、模式匹配(Java 21+),更简洁、更安全。
  3. 密封类(sealed class,Java 17+)有什么用? 答:限制类的继承范围,提高类型安全性,常用于状态建模、代数数据类型。

建议把上面 19 道题都手写一遍答案 + 代码验证,尤其是集合底层、HashMap 1.8 红黑树引入原因、线程安全问题,这三题几乎必考。

你现在最想针对哪几道题来深入手撕代码追问变种

  • HashMap put 过程完整画图讲解?
  • ConcurrentHashMap 1.8 扩容 & put 详细流程?
  • ArrayList & LinkedList 增删改查时间复杂度对比代码验证?
  • 还是来一套完整的“Java 基础 50 题”刷题清单?

告诉我你的需求,我继续陪你冲刺~

文章已创建 4323

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部