Java基础面试需以JVM内存模型为逻辑主线:int age=25在栈存值,String s=new String("abc")涉及栈引用、堆对象、常量池字面量;自动装箱Integer i=100调用valueOf(),-128~127缓存;方法区存类元信息,static变量在此;封装重在实现隔离,继承关注super调用与重写约束,多态依赖运行时实际类型;典型陷阱如float赋值、short运算、String不可变性及equals/hashCode契约。

Java 基础面试题深度复习不是堆砌知识点,而是建立清晰的逻辑主线,把零散概念串成可解释、可推演、可落地的认知网络。重点不在“背答案”,而在“能讲清为什么”。
紧扣 JVM 内存模型反向驱动基础理解
从内存分配切入,自然覆盖数据类型、变量、对象生命周期等核心点:
- 看到
int age = 25,立刻反应:栈中分配 4 字节,值直接存储;而String s = new String("abc")是栈存引用、堆存对象、常量池存字面量——三者位置和关系必须明确 - 自动装箱(
Integer i = 100)本质是调用Integer.valueOf(),要清楚缓存范围(-128 到 127),超出范围就 new 对象,这直接影响 == 比较结果 - 方法区(JDK 8+ 是 Metaspace)存放类元信息,所以
static变量、常量、类方法都在这里;而局部变量、方法参数一定在栈帧里
以面向对象三大特性为骨架组织知识
不孤立记定义,而是用代码行为验证每一条特性:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
封装:不是“private + getter/setter”就完事,关键是看访问控制是否真正隔离了内部实现——比如
ArrayList的elementData是transient数组,外部无法直接操作,扩容逻辑完全隐藏 -
继承:关注
super()调用时机、构造器链、方法重写约束(返回类型协变、异常不能更宽);特别注意final类不能被继承、private方法不能被重写 -
多态:运行时决定调用哪个方法,依赖的是对象实际类型而非引用类型;
Animal a = new Dog(); a.eat()调用的是Dog.eat(),但前提是eat()是非 private、非 static、非 final 的实例方法
用典型陷阱题锤炼边界意识
高频错误点往往是理解模糊或记忆偏差的信号,需逐条拆解:
立即学习“Java免费学习笔记(深入)”;
-
float f = 3.4;错——3.4 是 double 字面量,必须写成3.4f或强制转型 -
short s1 = 1; s1 = s1 + 1;错——s1 + 1结果是 int,需显式强转;而s1 += 1正确,因为复合赋值运算符自带隐式类型转换 -
String不是基本类型,它是不可变的引用类型;==比较地址,.equals()才比较内容;重写equals()必须同步重写hashCode() -
Math.round(11.5)得 12,Math.round(-11.5)得 -11——因为 round 是“四舍五入到最近整数,.5 向正无穷取整”
结合集合与字符串深化语法细节
这些看似独立的知识点,其实都扎根于基础机制:
-
String字符串拼接:+在编译期优化为StringBuilder(仅限常量),运行时拼接建议显式用StringBuilder;String.intern()把字符串放入常量池,可减少重复对象 -
HashMap的 key 为什么推荐用不可变对象?因为 hash 值必须稳定——如果 key 的字段参与了hashCode()计算,且该字段后续被修改,会导致 get 时定位不到原 bucket -
ArrayList底层是数组,get(i)是 O(1),add(0)是 O(n);LinkedList是双向链表,头尾增删是 O(1),随机访问是 O(n)——性能差异源于数据结构本质

















