在Java中,关于对象比较,下列代码的输出结果是什么? ``` String s1 = new String("Java"); String s2 = "Java"; String s3 = s1.intern(); System.out.println((s1 == s2) + " " + (s2 == s3)); ```
答案解析
### 核心考点说明
本题综合考察字符串常量池机制、`intern()`方法的作用及对象引用比较(==)与值比较(equals)的区别。
### 解题思路分析
1. `s1`在堆中创建新对象,不加入常量池
2. `s2`直接指向常量池中的"Java"
3. `s1.intern()`返回常量池中已存在的"Java"引用(即`s2`)
4. `==`比较引用地址,`equals`比较值
### 选项详细分析
- **A**:错误。未理解`intern()`会返回常量池引用
- **B**:正确。`s1`与`s2`地址不同,`s2`与`s3`地址相同
- **C**:错误。混淆堆对象与常量池对象的地址区别
- **D**:错误。误认为所有字符串创建方式都会复用常量池
### 易错点提醒
- 使用`new`创建的字符串对象不会自动放入常量池
- `intern()`方法在常量池存在对应字符串时直接返回引用,否则添加并返回
- ==比较的是内存地址而非内容
正确答案:B