Java 基础面试题精选:从语法到集合(2025-2026 高频真实考点)
以下内容按出现频率从高到低排列,覆盖了几乎所有大厂(阿里、字节、腾讯、美团、京东、华为、拼多多等)Java 后端/后端实习/校招一面、二面最常问的基础题目。
一、基础语法与 JVM 内存相关(最常考前 10 题)
- Java 中基本数据类型和引用数据类型有哪些?各自默认值是多少? 回答要点:
- 基本类型(8种):byte(0)、short(0)、int(0)、long(0L)、float(0.0f)、double(0.0)、char()、boolean(false)
- 引用类型:类、接口、数组、String、包装类等,默认值 null
- == 和 equals() 的区别?String 为什么可以直接用 == 比较? 高频追问:
- == 比较的是内存地址(基本类型比值,引用类型比地址)
- equals() 默认也是比地址,但 String、Integer 等重写了 equals(),实现值比较
- String s1 = “hello”; String s2 = “hello”; → s1 == s2 为 true(字符串常量池)
- String、StringBuilder、StringBuffer 的区别? 特性 String StringBuilder StringBuffer 是否可变 不可变 可变 可变 线程安全 是(不可变) 否 是(方法加 synchronized) 性能 — 最快 较慢 使用场景 常量、少量拼接 单线程大量拼接 多线程拼接 面试结论:日常 99% 用 StringBuilder,除非明确多线程场景才考虑 StringBuffer。
- final、finally、finalize 的区别?
- final:修饰类(不可继承)、方法(不可重写)、变量(不可修改,基本类型值不变,引用类型地址不变)
- finally:try-catch 块中必定执行的代码块(即使 return、throw 也会执行)
- finalize:Object 类方法,GC 前可能调用(已过时,Java 9 标记 deprecated)
- 重载(Overload)和重写(Override)的区别? 维度 重载(Overload) 重写(Override) 位置 同一个类 子类 方法名 相同 相同 参数列表 不同(数量/类型/顺序) 相同 返回值 可不同 相同或协变类型(Java 5+) 异常 可不同 更窄或相同 访问修饰符 可不同 更宽松或相同
- 抽象类和接口的区别?(Java 8 后变化很大) 特性 抽象类 接口(Java 8+) 成员变量 可以有普通变量 只能有 public static final 方法 可以有抽象+非抽象方法 默认方法、静态方法、私有方法 构造方法 可以有 没有 继承/实现 单继承 多实现 使用场景 模板方法、代码复用 功能扩展、行为约定 现在面试常问:“为什么 Java 8 后接口可以有 default 方法?”
答:为了在不破坏已有实现类的情况下扩展接口功能(典型例子:Collection.sort()、Stream API)。
二、面向对象高频题
- 构造方法的作用?能否被继承?能否被重载?
- 作用:初始化对象、给成员变量赋初值
- 不能被继承(但子类会隐式调用父类无参构造)
- 可以被重载(多个构造方法)
- this 和 super 的作用?
- this:指代当前对象(this.属性、this.方法、this() 调用本类其他构造)
- super:指代父类对象(super.属性/方法、super() 调用父类构造)
- Java 中多态的体现?
- 父类引用指向子类对象
- 方法重写(运行时绑定)
- 接口实现
- 向上转型(自动)、向下转型(需强转)
三、集合框架(Collection & Map)高频题
- ArrayList 和 LinkedList 的区别?底层实现?适用场景? 项目 ArrayList LinkedList 底层结构 动态数组 双向链表 随机访问 O(1) O(n) 插入/删除 O(n)(需移动元素) O(1)(改指针) 内存占用 较连续,较低 每个节点有 prev/next,较高 适用场景 查询多、尾部增删 头部/中间频繁增删、队列/栈
- 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) 高低位异或,减少碰撞
- HashMap 为什么线程不安全?ConcurrentHashMap 如何实现线程安全?
- HashMap 不安全原因:put 时多线程扩容可能死循环(1.7)、数据覆盖丢失(1.8)
- ConcurrentHashMap(1.8):
- 数组 + 链表/红黑树
- 采用 CAS + synchronized 细粒度锁
- 扩容时多线程协助扩容
- size 用 volatile + 分段计数
- HashSet 如何保证不重复?底层实现?
- 底层基于 HashMap,key 存元素,value 存常量对象
- add() → put() → hashCode() + equals() 双重判断
- TreeMap / TreeSet 底层是什么?为什么有序?
- 底层红黑树
- 按照 key 的自然顺序或 Comparator 排序
四、异常处理 & 其他高频
- throw 和 throws 的区别? 项目 throw throws 位置 方法体内 方法声明后 作用 手动抛出异常对象 声明方法可能抛出的异常 后跟内容 new XXXException(…) 异常类名(可多个,用逗号隔)
- Error 和 Exception 的区别?常见子类?
- Error:严重问题(OutOfMemoryError、StackOverflowError),程序无法恢复
- Exception:可捕获、可恢复(RuntimeException + 受检异常)
- RuntimeException:空指针、数组越界、类型转换、除零等(非受检)
- 受检异常:IOException、SQLException 等(必须处理)
五、2025-2026 年新增/变热的高频基础题
- record 关键字(Java 16+)是什么?解决了什么问题? 答:不可变数据载体,自动生成构造器、getter、equals、hashCode、toString,极大减少样板代码。
常用于 DTO、VO、配置类。 - switch 表达式(Java 14+ → 21 完善)与传统 switch 的区别? 答:支持箭头语法(->)、yield 返回值、模式匹配(Java 21+),更简洁、更安全。
- 密封类(sealed class,Java 17+)有什么用? 答:限制类的继承范围,提高类型安全性,常用于状态建模、代数数据类型。
建议把上面 19 道题都手写一遍答案 + 代码验证,尤其是集合底层、HashMap 1.8 红黑树引入原因、线程安全问题,这三题几乎必考。
你现在最想针对哪几道题来深入手撕代码或追问变种?
- HashMap put 过程完整画图讲解?
- ConcurrentHashMap 1.8 扩容 & put 详细流程?
- ArrayList & LinkedList 增删改查时间复杂度对比代码验证?
- 还是来一套完整的“Java 基础 50 题”刷题清单?
告诉我你的需求,我继续陪你冲刺~