Java
Java
Java 由 Sun Microsystems 的 James Gosling 于 1995 年发布,核心设计理念是 "Write Once, Run Anywhere"——通过 JVM 字节码实现跨平台运行。三十年发展后,Java 已成为企业级应用开发的主流语言,生态覆盖微服务到大数据。
Java 知识全景:
语言基础
Java类型系统 是语言核心:基本类型与包装类的值语义、自动装箱陷阱、String 不可变与常量池、泛型的编译期擦除、枚举、BigDecimal 精度——理解这几条规则能解释一半的日常踩坑。Java面向对象 是组织代码的方法论:封装隐藏实现、继承与接口表达"是什么/能做什么"、多态让调用方依赖抽象——Spring 的依赖注入、MyBatis 的 Mapper 接口都是面向抽象编程的实践。Java内部类 四种类型(静态嵌套类、成员内部类、局部内部类、匿名内部类)各有适用场景,匿名内部类在 Java 8 后逐渐被 Lambda 取代。反射机制 赋予运行时动态能力——Spring 依赖注入、JUnit 测试发现、Jackson JSON 序列化底层都依赖反射,但性能代价(比直接调用慢 2-50 倍)需要权衡。Java异常处理 以 Throwable 为根分 Error 与 Exception,受检异常强制捕获是 Java 与 C/Python 的显著差异。
集合框架
Java集合 深入对比 HashMap 与 Hashtable、ArrayList 与 LinkedList 等核心数据结构选择策略,并收录常见陷阱:Arrays.asList() 返回的列表不可修改、Collectors.toMap() 的 value 不能为 null、subList 不可强转 ArrayList——这些在生产环境中频繁引发 bug。现代开发中 ConcurrentHashMap 取代 Hashtable,ArrayList 在绝大多数场景优于 LinkedList。
GuavaCache 是 Google Guava 库提供的本地缓存实现,支持过期、淘汰、自动加载,适合单机热点数据缓存;分布式缓存见 Redis。
并发编程
Java并发编程 是 Java 最具深度的知识领域。wait() 与 sleep() 本质区别在于是否释放锁;ThreadLocal 为每个线程提供独立变量副本,但线程池中使用不当会导致内存泄漏;BlockingQueue 是实现生产者-消费者模式的标准方案。
Java锁机制 是同步的底层骨架:synchronized 是 JVM 内置锁,ReentrantLock 弥补其不可中断/不可超时的局限,CAS 是无锁方案,AQS 是 JUC 全部锁和同步器的公共框架。Java线程池 用 ThreadPoolExecutor 七大参数和四种拒绝策略控制线程生命周期,Executors 工厂方法有 OOM 隐患需谨慎。
JVM 层面的并发支持同样重要。JVM 中的 Java 内存模型(JMM)定义主内存与工作内存的交互规则,volatile 通过内存屏障保证可见性和有序性但不保证原子性。Happens-Before 原则是判断多线程安全性的理论基础。
JVM 深入
JVM 内部机制决定应用性能上限。堆空间分代结构(新生代、老年代)对应不同垃圾收集策略。从 Serial 到 G1 再到 ZGC,收集器演进方向是减少 Stop-The-World 停顿时间。
类加载采用双亲委派模型,BootstrapClassLoader、ExtensionClassLoader、AppClassLoader 各司其职。理解类加载对排查 ClassNotFoundException 和 NoClassDefFoundError 至关重要。
锁优化是性能调优关键:偏向锁→轻量级锁→重量级锁的升级过程,以及锁消除、锁粗化等 JIT 优化手段。
JavaIO与NIO 是 I/O 的两代方案:经典 IO 一连接一线程,NIO 用选择器单线程管理海量连接,是 Netty 等高性能框架的底层——选型口诀是简单文件读写用经典 IO,高并发网络编程用 NIO。
字节码
Java字节码 是连接源码与 JVM 执行的桥梁。每个 .class 文件包含字节码指令,由操作码(1字节)和操作数组成。理解字节码有助于深入理解语法糖实现原理(增强 for 循环、try-with-resources、Lambda)。
javap 是 JDK 内置反编译工具,配合 jclasslib 可可视化分析。Arthas 等工具可实时查看线上字节码执行情况。
现代特性
Java8新特性 是语言演进的重要分水岭,Lambda 表达式、Stream API、Optional 类让 Java 从纯面向对象向函数式编程迈出关键一步。方法引用、默认方法、CompletableFuture 与新的日期时间 API 一并收录其中。
工程实践
Java类型系统 的枚举章节解释了枚举比较为何用 ==。Java单例模式 四种实现(饿汉式、DCL、静态内部类、枚举),枚举实现是 Joshua Bloch 推荐的最佳方式。