Java高频面试题深度解析(附实战代码案例)

Java高频面试题深度解析与实战

一、String的不可变性(必考题)

"你以为String就是简单的字符组合?大错特错!"面试官最爱用这个知识点挖坑。来看关键点:

  1. 内存模型:每个String对象都存储在堆内存的字符串常量池中
  2. 修改真相String s = "hello"; s += " world"; 实际上创建了3个对象!(原"hello"、" world"和新的"hello world")
  3. 实战对比
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. 标记-清除(会产生内存碎片)
  2. 复制算法(新生代使用)
  3. 标记-整理(老年代使用)

七、设计模式实战精选

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流
└── 新特性

(温馨提示)面试前必做的三件事:

  1. 手写单例模式(至少掌握3种写法)
  2. 画HashMap的put流程图
  3. 准备2个项目中的实际场景问题

记得把代码自己敲三遍!光看不动手等于白学!遇到问题欢迎留言讨论~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值