0

我的问题是关于 java 中的字符串池。

情况1:

StringBuilder sb = new StringBuilder();
sb.append("First");
sb.append("Two");
sb.append("Three");
sb.append("Four");

案例二:

StringBuilder sb = new StringBuilder();
sb.append("First"+"Second"+"Three"+"Four");

以上2个案例执行后,字符串池中会有多少个字符串对象?(注意:假设字符串池在每个案例之前都有0个对象。)

我的假设=>

在第一种情况下:

字符串池在第一种情况结束时将有 4 个字符串对象。如何?说明:将创建字符串“First”,并将其添加到字符串池中并修改 sb。然后将创建另一个字符串对象“Two”,将其保存在字符串池中,并且 sb 将被修改。同样,在第一种情况结束时,字符串池将有 4 个字符串对象。

在第二种情况下:字符串池将有 7 个字符串对象。如何?说明:字符串“First”和“Two”将在池中创建,然后由于我们连接“First”和“Two”,第三个字符串对象“FirstSecond”将在字符串池中创建。同理,在第 2 种情况结束时,字符串池将有 7 个对象。

如果我错了,请纠正我。

4

1 回答 1

1

你错了。在第一个示例中,池中有四个字符串文字,它们不是在运行时创建的,而是在编译时创建的,并在类初始化时添加到池中。第二个示例将在池中具有一个字符串文字,因为连接是一个常量表达式,编译器对其进行评估并将其作为单个文字嵌入字节码中。

在运行时评估的更一般情况下,当它不是常量表达式时,您仍然不会得到七个字符串。例如,在

String foo = getPrefix() + getName() + " foo " + getSuffix();

您将四个字符串连接成一个,总共五个,不一定是实习生。不是七个,因为一行字符串连接被实现为StringBuilder#append调用,并且没有中间字符串实例,只有最后的结果一个。

于 2017-03-12T11:22:37.450 回答