3

下面是实例方法中的代码片段

 String x = new StringBuffer().append("a").append("b").append("c").toString()

我的印象是,首先创建新的字符串缓冲区,然后将 a 添加到字符串缓冲区的最后,类似于 b 和 c。在该字符串缓冲区转换为字符串之后。因此,据我所知,创建了 2 个对象(一个用于字符串缓冲区,另一个用于字符串)。正确的?基本上按照我的说法,不会为字符串“a”、“b”、“c”创建中间对象。这是正确的吗?

编辑:-根据所有回复,看起来将为字符串文字“a”,“b”,“c”创建对象但是如果我通过链接http://docs.oracle.com/javase/1.4。 2/docs/api/java/lang/StringBuffer.html#toString (),这不应该创建临时字符串。搜索“总体而言,这避免了创建许多临时字符串。” 在这个链接上。同意它适用于 1.4.2,但我希望 1.6 的基本面保持不变

是的,如果我在下面而不是在上面创建五个对象。三个代表 "a","b","c" 。一个用于字符串缓冲区。最后是从字符串缓冲区转换的字符串。"a","b","c" 的对象和最后的字符串 "abc" 将进入池中并且终生存在

String str1="a";
String str2="b";
String str3="c";
String x = new StringBuffer().append(str1).append(str2).append(str3).toString()

以上理解正确吗?

4

3 回答 3

3

在创建对象的数量方面,您的第一个和第二个片段之间没有区别。字符串"a""b""c"将参与该过程,尽管可以使用它们的内部副本在没有进一步引用的情况下str1..str3,编译器可以自由地将您的第二个片段转换为您的第一个片段,从而消除变量。

此外,如果其内部字符串中的内存不足以容纳正在附加的数据,则StringBuffer's内部可能存在内部重新分配。append这只是理论上的可能性,但它确实存在。

于 2012-07-26T16:19:50.730 回答
1

正如其他答案中所指出的,您的两个片段是等效的(关于 String 对象创建)。相反,如果第二个片段被写成:

String str1= new String("a");
...

只有在这种情况下,您才能保证实例化一个新的 String 对象(不是您通常想要的)。另请参见此处

于 2012-07-26T16:26:14.313 回答
1

字符串“a”、“b”、“c”是两个代码片段中的文字。它们将在您的代码执行之前由类加载器创建,并且没有办法(通常也没有必要)避免这种情况。

所以这两个代码片段本质上都是一样的,并且它们都创建了相同数量的对象。

而且,顺便说一句,这两个片段都不是有效代码 - 您不能像在两个片段中的最后一条语句中那样分配 StringBuffer = String 。

编辑:您还询问Java版本> 1.4。从 Java5 开始,StringBuffer 应该被 StringBuilder 替换(它本质上是完全一样的,但它不是同步的,因此它的性能要好一些)。

于 2012-07-26T16:28:09.120 回答