硬核java八股文专栏
在 Java 面试中,八股文是每个面试官都会关注的点,尤其是基础语法、集合框架、并发机制、JVM 原理等。今天,我就给大家整理一篇 硬核 Java 八股文专栏,帮你从零到精通,让你面试时胸有成竹。
全网最全面的java八股文:https://www.nowcoder.com/creation/manager/columnDetail/0n9XOd
一、基础语法与核心概念
1️⃣ 数据类型与包装类
- Java 基本类型:
int
、long
、float
、double
、boolean
、char
。 - 包装类:
Integer
、Long
、Double
等,注意 自动装箱与拆箱 的性能问题。 - 小技巧:
Integer
缓存 -128~127,超出范围每次 new 对象。
Integer a = 100, b = 100; System.out.println(a == b); // true Integer x = 200, y = 200; System.out.println(x == y); // false
2️⃣ 字符串与字符串池
String
不可变,底层用char[]
保存。StringBuilder
/StringBuffer
可变,性能更高。- 字符串池:
intern()
方法可以手动加入池中。
String s1 = "hello"; String s2 = new String("hello").intern(); System.out.println(s1 == s2); // true
3️⃣ 面向对象基础
- 继承:单继承,多层父子关系。
- 多态:编译时看引用类型,运行时看实际对象。
- 接口:Java 8 之后支持默认方法。
- 抽象类 vs 接口:抽象类有构造函数,可有成员变量,接口更灵活。
二、集合框架
1️⃣ List、Set、Map
- ArrayList:数组实现,查询快,增删慢。
- LinkedList:链表实现,增删快,查询慢。
- HashSet:基于 HashMap,无序、不重复。
- TreeSet:红黑树,自动排序。
- HashMap vs ConcurrentHashMap:线程安全差异。
2️⃣ HashMap 原理
- 数组 + 链表(Java8 之后链表长度到 8 会转红黑树)。
- hash 值 + 桶索引。
- 扩容:容量达到 loadFactor 时,数组扩容 2 倍。
Map<String, String> map = new HashMap<>(); map.put("a", "apple"); map.put("b", "banana");
3️⃣ 面试考点
HashMap
key 可以为 null,但Hashtable
不行。ConcurrentHashMap
分段锁,线程安全,性能高。LinkedHashMap
保留插入顺序或访问顺序。
三、并发编程
1️⃣ 线程基础
- Thread 类与 Runnable 接口。
- Callable + Future 可获取返回值。
- 线程池:
Executors
提供FixedThreadPool
、CachedThreadPool
、ScheduledThreadPool
。
2️⃣ 锁机制
- synchronized:对象锁/类锁,阻塞。
- ReentrantLock:可重入,可尝试锁。
- ReadWriteLock:读写分离,提高并发效率。
3️⃣ volatile、CAS、原子类
volatile
保证可见性,不保证原子性。AtomicInteger
、AtomicLong
基于 CAS。CountDownLatch
、CyclicBarrier
、Semaphore
用于线程协作。
四、JVM 与内存管理
1️⃣ JVM 内存结构
- 方法区:存储类信息、常量。
- 堆:存储对象,分年轻代、老年代。
- 栈:方法调用,存局部变量。
- PC 寄存器:线程指令执行位置。
- 本地方法栈:Native 方法使用。
2️⃣ 垃圾回收
- GC 分代收集:Minor GC、Full GC。
- 常用算法:标记-清除复制算法标记-整理
- JVM 参数:-Xmx 最大堆-Xms 初始堆-XX:+UseG1GC 启用 G1 收集器
五、面试真题精选
- 为什么 HashMap 可以存储 null key?
- volatile 和 synchronized 的区别?
- HashMap 扩容时线程不安全的原因?
- Java 中 String 为什么是不可变的?
- Thread 和 Runnable 的区别?
六、总结
Java 八股文看似枯燥,但掌握它等于掌握了面试的 “底层密码”。通过系统梳理基础语法、集合、并发、JVM,你就能在面试中胸有成竹。
💡 小建议:
- 每个知识点配合代码实践。
- 理论结合面试常问问题,能用自己的语言解释原理。
- 看源码理解细节,例如
HashMap
、ConcurrentHashMap
、ArrayList
等。