文章目录
-
-
-
- [1. 字符串常量池](#1. 字符串常量池)
- [2. 创建对象分析](#2. 创建对象分析)
- [3. 总结](#3. 总结)
- [4. 推荐的做法](#4. 推荐的做法)
- 推荐阅读文章
-
-
在Java中,字符串的处理是一个重要且常见的操作。尤其是 String
类的使用,常常让初学者感到困惑。今天,我们就来详细分析一下这行代码: String str = new String("hello");
,并弄清楚在这行代码中究竟创建了几个对象。
1. 字符串常量池
在Java中,字符串字面量(如"hello"
)会被存储在一个特殊的内存区域,称为字符串常量池(String Pool)。这个池中的字符串是不可变的,也就是说,一旦创建后,它们的值就不能更改。
2. 创建对象分析
当你执行String str = new String("hello");
时,实际上创建了两个对象:
-
字符串字面量对象 :
"hello"
是一个字符串字面量,在编译时就被放入了字符串常量池中。这个对象在常量池中存在,即使之后不再使用,常量池中的内容也不会被垃圾回收。 -
String
对象 :new String("hello")
会在堆内存中创建一个新的String
对象,并将常量池中的"hello"
的内容复制到这个新对象中。因此,堆中又多了一个String
对象。
3. 总结
综上所述,执行String str = new String("hello");
时,总共创建了两个对象:
- 一个在字符串常量池中的
"hello"
对象。 - 一个在堆内存中的
String
对象。
这段代码示例的对象创建过程如下图所示:
+-----------------+ +-----------------+
| String Pool | | Heap |
+-----------------+ +-----------------+
| "hello" | | String: "hello" |
+-----------------+ +-----------------+
4. 推荐的做法
虽然使用new String("hello")
可以创建一个新的String
对象,但在大多数情况下,推荐使用字符串字面量(例如String str = "hello";
),这样可以避免不必要的对象创建,节省内存和提高性能。因为字符串常量池会对相同的字符串进行重用,只有在需要明确创建新对象时,才使用new
关键字。
希望通过这篇文章,你能清楚地理解String str = new String("hello");
中创建的对象数量,以及在实际开发中如何更高效地使用字符串!