String在生成的过程中如何创建对象?
String s1 = new String("hello")
String s2 = "world"
String s3 = new String("x") + new String("y")
String s5 = new String("abc") + "def"
String s6 = new String("x") + new String("y") + new String("z");
上述String对象在创建的过程中都创建了几个对象?这就是本文要探讨的问题。
分析以下简单问题,这个过程创建了几个对象?
String s1 = new String("hello");
答案:1个或者2个
解析:首先就是"hello",如果常量池中没有这个字符串,首先会在常量池中创建这个对象
其次是堆中的 new String("hello")
对象
所以是2个,如果常量池中有hello字符串对象,则为1个
字符串池
由于字符串是不可变的,Java 可以有效地将字符串放入字符串池中。字符串池是一个特殊的内存区域,用于存储常用的字符串对象。当你创建一个字符串对象时,Java 首先会检查字符串池中是否已经存在相同内容的字符串,如果存在,就会返回池中的引用,而不会创建新的对象。这可以节省内存,并提高性能。
String s2 = "world";创建了几个对象?
答案:1个或者0个
解析:只有常量池中创建world对象,或者本身就有不用创建直接指向
上难度
String s3 = new String("x") + new String("y");
创建了几个对象?
答案:6个或者4个
解析:首先是常量池中的x,y两个对象
其次是两个new String( )对象
生成过程中用到了+号,则会有一个StringBuilder
对象用于拼接
最后是拼接结束后StringBuilder.toString()
生成的 String
对象。
StringBuilder
是一个可变对象,而String
是不可变对象。在拼接字符串的过程中,StringBuilder
提供了更高效的方式,因为它不需要像String
那样每次拼接都创建一个新的字符串对象。最终,我们需要得到一个不可变的字符串结果,这时就需要使用toString()
方法。调用
StringBuilder.toString()
会生成一个新的String
对象,该对象包含StringBuilder
当前内部字符数组的副本,并且这个String
对象是不可变的。
String s5 = new String("abc") + "def"; 创建了几个对象?
- 常量池中的
"abc"
对象(如果已经存在,则不再创建)。 - 常量池中的
"def"
对象(如果已经存在,则不再创建)。 - 堆中的
new String("abc")
对象。 StringBuilder
对象(用于拼接)。StringBuilder.toString()
生成的String
对象。
总共:5 个对象(如果 "abc"
和 "def"
已存在于常量池中,则为 3 个)。
String s6 = new String("x") + new String("y") + new String("z");
- 常量池中的
"x"
对象(如果已经存在,则不再创建)。 - 常量池中的
"y"
对象(如果已经存在,则不再创建)。 - 常量池中的
"z"
对象(如果已经存在,则不再创建)。 - 堆中的
new String("x")
对象。 - 堆中的
new String("y")
对象。 - 堆中的
new String("z")
对象。 StringBuilder
对象(用于拼接"x"
和"y"
)。StringBuilder.toString()
生成的中间String
对象(拼接"x"
和"y"
生成的)。StringBuilder
对象(用于拼接上一步的结果和"z"
)。StringBuilder.toString()
生成的最终String
对象。
总共:10 个对象(如果 "x"
、"y"
和 "z"
已存在于常量池中,则为 7 个)。