返回信息流String A,B,C;
A="A"; //a1
B="B"; //a2
A=A+B; //a3
StringBuilder D=new StringBuilder("abc"); //a4
D=D.append("567"); //a5
一共创建了多少个对象 ??
答案是5个 ,a1行创建一个,a2行创建一个,a3行创建一个,a4行创建两个(StringBuilder和"abc").
为什么a5行的"567"没有创建一个对象呢 ?? 类编译期 , 哪些的字符串会写入常量池中 ??
这是一条镜像帖。来源:北邮人论坛 / java / #24734同步于 2013/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]关于字符串常量池的问题 ,求助!!!!!
xinster819
2013/4/9镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 feifeiflight 的大作中提到: 】
: 我觉得问题有歧义 是说有多少个字符串对象么?如果是我觉得是5个 每行一个。。。 如果是说对象的话如果常量池都没有 我觉得是6个。。。
最后那个567会写入到常量池中吗??
【 在 feifeiflight 的大作中提到: 】
: 我觉得是6个 可能出题的考虑的是这样的 append 没有像string那样增加对象 考察的是这点 而忽略了里面的 字符串 不用死扣那么细
3Q , 就是不知道是书里的错误,还是我一直就理解错了, 所以问一下
Java Language Specification
Section 3.10.5. String Literals
http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5
Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.
这说明,内容相同的字符串常量,总是引用同一个String对象。
所以,即使A="A"这样的表达式,也不能保证“创建”一个对象。有可能这个"A"的对象早就创造好了。
所以第一、二行都不保证能创造对象。
Java Language Specification
Section 15.18.1. String Concatenation Operator +
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1
The result of string concatenation is a reference to a String object that is the concatenation of the two operand strings. The characters of the left-hand operand precede the characters of the right-hand operand in the newly created string.
The String object is newly created (§12.5) unless the expression is a compile-time constant expression (§15.28).
所以,第三行的C=A+B;会创造一个新的对象。
第四行是new表达式,肯定会创造一个StringBuilder对象,但是是否仅仅是1个对象,就和StringBuilder的实现有关了。对于OpenJDK 1.7来说,会内部创造一个char[]数组。字符串常量"abc"不保证创造一个新对象,有可能已经创造好了。
D.append("567")同样,和StringBuilder的实现有关。对于OpenJDK 1.7来说,当内部的数组容量不够的时候,会开辟一个更大的数组,扩充容量。所以在不指定具体实现的情况下,无法预料创造不创造对象。同样,"567"不保证创造一个对象,而append的方法和具体的StringBuilder实现有关。
总之,创造对象的数目无法预计,但只有两个地方保证会创造对象:一个是C=A+B的字符串连接运算符,另一个是new StringBuilder。
【 在 nuanyangyang 的大作中提到: 】
: Java Language Specification
: Section 3.10.5. String Literals
: http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5
: ...................
受教了 , 牛人啊!!