Java:字符串池

时间:2017-03-12 11:03:30

标签: java string string-pool

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

案例1:

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

案例2:

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

执行上述两种情况后,字符串池中会有多少个字符串对象?(注意:假设字符串池在每种情况下都有0个对象。)

我的假设=>

在第一种情况下:

字符串池在第一种情况结束时将有4个字符串对象。 怎么样? 说明:String" First"将被创建,它将添加在字符串池和&某人将被修改。然后另一个字符串对象"两个"将被创建,将其保留在字符串池和&某人将被修改。同样,在第一种情况结束时,字符串池将有4个字符串对象。

第二种情况: 字符串池将有7个字符串对象。 怎么样? 说明:String" First" &安培; "两个"将在池中创建,然后因为我们连接" First" &安培; "两个",第三个字符串对象" FirstSecond"将在字符串池中创建。同样,在第二种情况结束时,字符串池将有7个对象。

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

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

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

String foo = getPrefix()+ getName()+“foo”+ getSuffix();

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