文章目录
一、String的不可变性(必考题)
"你以为String就是简单的字符组合?大错特错!"面试官最爱用这个知识点挖坑。来看关键点:
- 内存模型:每个String对象都存储在堆内存的字符串常量池中
- 修改真相:
String s = "hello"; s += " world";实际上创建了3个对象!(原"hello"、" world"和新的"hello world") - 实战对比:
String str1 = "java";
String str2 = new String("java");
System.out.println(str1 == str2); // false!!!
为什么这样设计?(面试加分项)
- 安全性:防止敏感数据被篡改
- 哈希码缓存:提升哈希表性能
- 线程安全:天生适合多线程环境
二、==与equals的世纪对决
这个知识点每年坑掉50%的求职者!看黑板:
String a = new String("android");
String b = new String("android");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true(因为String重写了equals)
内存示意图:
栈内存 堆内存
a --> 0x001 --> "android"
b --> 0x002 --> "android"
(超级重要)记住黄金法则:
==比较内存地址equals比较对象内容(但需要正确重写)
三、异常处理黑科技
你以为try-catch-finally就是全部?Too young!
异常金字塔(开发必知):
Throwable
├── Error(系统级错误)
└── Exception
├── RuntimeException(可处理可不处理)
└── 非RuntimeException(必须处理)
最新try-with-resources写法:
try (FileInputStream fis = new FileInputStream("test.txt")) {
// 自动关闭资源!!!
} catch (IOException e) {
e.printStackTrace();
}
四、多线程三大核心问题
1. 线程创建姿势大全:
- 继承Thread类(不推荐,Java单继承限制)
- 实现Runnable接口(最常用)
- 使用Callable+Future(需要返回值时使用)
2. synchronized的隐藏特性:
public class Counter {
private int count = 0;
// 锁住整个实例对象
public synchronized void add() {
count++;
}
// 锁住类对象
public static synchronized void print() {
System.out.println("Static method");
}
}
3. volatile的可见性魔法:
volatile boolean flag = false;
// 线程A
flag = true;
// 线程B
while(!flag) {
// 立即看到flag变化
}
五、集合框架死亡陷阱
1. HashMap底层原理:
- JDK1.7:数组+链表
- JDK1.8:数组+链表/红黑树(链表长度>8时转换)
2. ConcurrentHashMap演进史:
JDK1.7 -> 分段锁
JDK1.8 -> CAS + synchronized
3. ArrayList扩容机制:
// 默认容量10
List<Integer> list = new ArrayList<>();
// 扩容公式:newCapacity = oldCapacity + (oldCapacity >> 1)
// 第11个元素触发扩容到15
// 第16个元素扩容到22...
六、JVM内存模型揭秘
内存结构图:
┌──────────────┐
│ 方法区 │(存储类信息)
├──────────────┤
│ 堆 │(对象实例)
├──────────────┤
│ 虚拟机栈 │(方法调用)
├──────────────┤
│ 本地方法栈 │
├──────────────┤
│ 程序计数器 │
└──────────────┘
GC算法三大门派:
- 标记-清除(会产生内存碎片)
- 复制算法(新生代使用)
- 标记-整理(老年代使用)
七、设计模式实战精选
1. 单例模式双重校验锁:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2. 工厂模式应用场景:
- 数据库连接池创建
- 日志记录器
- 加密算法选择
八、最新特性速览(JDK17+)
1. 模式匹配:
// 旧写法
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// 新写法
if (obj instanceof String s) {
System.out.println(s.length());
}
2. 密封类:
public sealed class Shape
permits Circle, Square, Rectangle {
// 只有指定类可以继承
}
高频考点思维导图
Java基础
├── 数据类型
├── 面向对象
├── 异常处理
├── 集合框架
├── 多线程
├── IO流
└── 新特性
(温馨提示)面试前必做的三件事:
- 手写单例模式(至少掌握3种写法)
- 画HashMap的put流程图
- 准备2个项目中的实际场景问题
记得把代码自己敲三遍!光看不动手等于白学!遇到问题欢迎留言讨论~
Java高频面试题深度解析与实战
629

被折叠的 条评论
为什么被折叠?



