String s1 = new String("abc")
在内存中创建的对象数量
这段代码在内存中可能会创建两个对象。具体数量取决于字符串 "abc"
是否已经存在于字符串池中。
-
堆内存中的新对象:
new String("abc")
会在堆内存中创建一个新的String
对象,即使"abc"
已经存在于字符串池中。这个新对象是对池中字符串的一个拷贝。 -
字符串池中的对象:在这行代码中,
"abc"
是一个字符串字面量,Java 会将它放在字符串常量池(string pool)中。如果"abc"
已经存在于字符串池中(比如在程序的其他部分已经用到过"abc"
),那么这个步骤不会再创建新对象。如果它还不存在,Java 会在字符串池中创建一个"abc"
对象。
形象的例子
场景:复印一份文档
想象你有一个公司文档库,所有的文档都存放在一个共享的文件柜中(字符串池)。你的任务是获取一份文档 "abc"
并制作一份复印件。
-
查找文件柜:你首先在文件柜中寻找文档
"abc"
。- 如果文件柜里已经有
"abc"
,你就不需要再创建这个文档;你只会指向这个文档,并准备复印。 - 如果文件柜里没有
"abc"
,你就创建一份新的"abc"
文档,放入文件柜中。
- 如果文件柜里已经有
-
制作复印件:无论文件柜中是否已经存在
"abc"
,你都会制作一份复印件,这个复印件是你实际使用的那一份。- 这就是堆内存中的
String
对象。
- 这就是堆内存中的
总结
String s1 = new String("abc")
这行代码至少会创建一个新的String
对象(堆内存中的拷贝)。- 可能还会在字符串池中创建一个
"abc"
对象,前提是字符串池中之前没有这个字面量。
因此,总的来说,这行代码通常会在内存中创建两个对象,一个在堆内存中,另一个可能在字符串池中。