### JAVA面试题解:String创建了几个对象? 在JAVA面试中,经常会出现关于`String`对象创建的问题。本文将深入探讨“一行代码创建了多少个`String`对象?”这一经典问题,通过对具体示例的分析,逐步揭示其背后的原理。 #### 代码示例 考虑以下代码: ```java String str = new String("abc"); ``` 这段代码看似简单,但背后涉及到了`String`对象的创建方式以及字符串池的概念。 ### 分析代码 #### 创建过程分析 1. **声明**:`String str`仅声明了一个名为`str`的变量,此时并没有创建任何对象。 2. **赋值**:`=`操作符用于将对象的引用赋值给变量`str`,这里也没有创建新对象。 3. **对象创建**:`new String("abc")`才是真正创建`String`对象的地方。这里涉及到两种不同的`String`对象创建方式: - **通过`new`关键字**:这种方式会直接在堆内存中创建一个新的`String`对象。 - **通过字符串字面量**:如`"abc"`,这种方式会在字符串池中查找或创建一个对应的`String`对象。 #### 字符串池概念 字符串池是一个特殊的数据结构,位于JVM的永久代中,用于存储字符串字面量。当字符串字面量通过字符串字面量的形式创建时,会首先检查字符串池中是否存在相同的字符串。如果存在,则直接返回该字符串的引用;如果不存在,则在字符串池中创建一个新的`String`对象,并返回其引用。 ### 示例解析 让我们逐一分析文章中提到的例子: 1. **单个字符串字面量** ```java String str = "abc"; ``` 这行代码创建了一个`String`对象,并将其放入字符串池中。如果之前字符串池中没有 `"abc"`,则会创建一个新的`String`对象。 2. **多个相同字符串字面量** ```java String a = "abc"; String b = "abc"; ``` 这里同样只创建了一个`String`对象,因为第二次引用`"abc"`时,字符串池中已经有了这个字符串,所以直接使用已有的引用。 3. **字符串拼接** ```java String a = "ab" + "cd"; ``` 这种情况下,`"ab"` 和 `"cd"` 都是编译时常量,所以在编译时会合并为一个字符串字面量`"abcd"`。因此,这行代码实际上等同于`String a = "abcd";`,只创建了一个`String`对象。 ### 进一步探讨 接下来,我们考虑更复杂的情况: 1. **运行时字符串拼接** ```java String a = "ab" + "cd"; // 假设是在运行时动态计算的结果 ``` 如果字符串拼接发生在运行时,那么结果将不会自动放入字符串池中。这是因为编译器无法提前知道拼接后的字符串是什么,除非显式地调用`intern()`方法。 2. **比较字符串** 使用`==`来比较字符串时,如果两边都是字符串字面量,则是比较它们在字符串池中的引用是否相同。例如: ```java String a = "abc"; String b = "abc"; System.out.println(a == b); // 输出 true ``` 但如果其中一个字符串是通过`new`创建的,则结果为`false`: ```java String a = new String("abc"); String b = "abc"; System.out.println(a == b); // 输出 false ``` ### 总结 通过以上分析,我们可以得出以下结论: - 单个字符串字面量如`"abc"`会创建一个`String`对象并放入字符串池。 - 相同的字符串字面量只会创建一次。 - 运行时的字符串拼接不会自动放入字符串池,除非显式调用`intern()`。 - `==`操作符比较的是引用,而非值;使用`equals()`方法比较字符串的值更为合适。 通过理解这些概念,不仅有助于解决面试中的常见问题,还能加深对Java内存管理和字符串处理机制的理解。
剩余7页未读,继续阅读
- 粉丝: 8
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助