探索 Java 初学者常见易混点与底层原理解析


📌 目录

  1. Java 中的值传递与引用传递到底是怎么回事?
  2. == 与 .equals() 的区别及使用场景
  3. 为什么建议使用包装类如 Integer 而不是 int
  4. String 的不可变特性究竟有什么用?
  5. Java 中的对象创建流程(new 背后的故事)
  6. 什么是自动装箱与拆箱?
  7. final 关键字:不仅仅是“常量”
  8. Java 中垃圾回收机制的基本逻辑
  9. Java 多线程中的关键字 synchronized 的本质
  10. 这些概念你真的懂了吗?(对象池、类加载器、内存区域)

1. Java 中的值传递与引用传递到底是怎么回事?

Java 只有一种参数传递方式:值传递(Pass by Value)

  • 对于基本类型,传递的是值的副本;
  • 对于对象引用类型,传递的是对象引用的副本。
public void change(StringBuilder sb) {
    sb.append(" world");
    sb = new StringBuilder("new object");
}

调用 change(sb) 后,原始 sb 会被修改为 "hello world",但不会指向 "new object"


2. == 与 .equals() 的区别及使用场景

  • ==:比较引用地址
  • .equals():比较对象内容
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b);       // false
System.out.println(a.equals(b));  // true

3. 为什么建议使用包装类如 Integer 而不是 int

  • 包装类可为 null(用于数据库、Map等)
  • 有很多实用方法(如 Integer.parseInt()
  • 自动装箱拆箱与集合类配合良好

但也要注意:

Integer a = 128;
Integer b = 128;
System.out.println(a == b);  // false

Integer x = 100;
Integer y = 100;
System.out.println(x == y);  // true

原因:[-128~127]范围会缓存 Integer 实例。


4. String 的不可变特性究竟有什么用?

  • 线程安全
  • 可用于字符串常量池优化内存
  • 适合作为 Map 的 Key

当你修改 String 时,其实是创建了一个新的对象。


5. Java 中的对象创建流程(new 背后的故事)

使用 new 创建对象会触发如下步骤:

  1. 类加载检查 → 类未加载则加载
  2. 分配内存 → 对象内存空间在堆中分配
  3. 初始化默认值
  4. 调用构造函数
  5. 返回引用

这背后涉及类加载器、堆内存分配、构造器链等知识。


6. 什么是自动装箱与拆箱?

  • 自动装箱int → Integer
  • 自动拆箱Integer → int
Integer x = 5;      // 自动装箱
int y = x + 1;      // 自动拆箱

装箱频繁时要避免使用包装类做数值运算,可能影响性能。


7. final 关键字:不仅仅是“常量”

  • final 变量:值不能变
  • final 方法:不能被子类重写
  • final 类:不能被继承
  • final 引用变量:地址不变,但对象内容可变!
final List<String> list = new ArrayList<>();
list.add("hello");   // 合法
list = new ArrayList<>(); // 编译错误

8. Java 中垃圾回收机制的基本逻辑

  • Java 中对象由 GC 自动回收,无需手动释放
  • 引用计数、可达性分析、分代收集是核心策略
  • 两个主要收集器:Young GC 和 Full GC
  • System.gc() 是一个建议,不一定立即回收

9. Java 多线程中的 synchronized 本质

synchronized 关键字用于保证线程安全,其本质:

  • 是一种悲观锁机制
  • 锁的是对象或类的“监视器锁”(Monitor)
  • JVM 层会将其翻译为 monitorenter / monitorexit

使用时注意锁粒度控制、死锁风险以及性能开销。


10. 这些概念你真的懂了吗?

  • 对象池(Object Pool):重复使用对象,节省开销(如线程池、连接池)
  • 类加载器(ClassLoader):负责将 .class 文件加载到 JVM 中
  • 内存区域(JVM Memory)
    • 方法区(元空间)
    • 堆(Heap)
    • 栈(Stack)
    • 本地方法区(Native)

✅ 结语

Java 的基础知识远不只是语法,而是对背后运行机制的深入理解。《Java 基础问题 第二篇》深入解释了引用、内存、对象、装箱、GC 等关键点,为进阶夯实基础。