探索 Java 初学者常见易混点与底层原理解析
📌 目录
- Java 中的值传递与引用传递到底是怎么回事?
==
与.equals()
的区别及使用场景- 为什么建议使用包装类如
Integer
而不是int
? - String 的不可变特性究竟有什么用?
- Java 中的对象创建流程(new 背后的故事)
- 什么是自动装箱与拆箱?
- final 关键字:不仅仅是“常量”
- Java 中垃圾回收机制的基本逻辑
- Java 多线程中的关键字 synchronized 的本质
- 这些概念你真的懂了吗?(对象池、类加载器、内存区域)
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
创建对象会触发如下步骤:
- 类加载检查 → 类未加载则加载
- 分配内存 → 对象内存空间在堆中分配
- 初始化默认值
- 调用构造函数
- 返回引用
这背后涉及类加载器、堆内存分配、构造器链等知识。
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 等关键点,为进阶夯实基础。
发表回复