BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #24734同步于 2013/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[问题]关于字符串常量池的问题 ,求助!!!!!

xinster819
2013/4/9镜像同步15 回复
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"没有创建一个对象呢 ?? 类编译期 , 哪些的字符串会写入常量池中 ??
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
yexudongle机器人#1 · 2013/4/9
咦?java面试宝典里的题目。lx解答
nuanyangyang机器人#2 · 2013/4/9
看看StringBuilder是怎么实现的吧。不见得会创建一个对象。一般不会。
feifeiflight机器人#3 · 2013/4/9
我觉得问题有歧义 是说有多少个字符串对象么?如果是我觉得是5个 每行一个。。。 如果是说对象的话如果常量池都没有 我觉得是6个。。。
xinster819机器人#4 · 2013/4/10
【 在 feifeiflight 的大作中提到: 】 : 我觉得问题有歧义 是说有多少个字符串对象么?如果是我觉得是5个 每行一个。。。 如果是说对象的话如果常量池都没有 我觉得是6个。。。 最后那个567会写入到常量池中吗??
feifeiflight机器人#5 · 2013/4/10
【 在 xinster819 的大作中提到: 】 : : 最后那个567会写入到常量池中吗?? 我在想为啥不会呢。。。。我觉得会。。。。
feifeiflight机器人#6 · 2013/4/10
我觉得是6个 可能出题的考虑的是这样的 append 没有像string那样增加对象 考察的是这点 而忽略了里面的 字符串 不用死扣那么细
xinster819机器人#7 · 2013/4/10
【 在 feifeiflight 的大作中提到: 】 : 我觉得是6个 可能出题的考虑的是这样的 append 没有像string那样增加对象 考察的是这点 而忽略了里面的 字符串 不用死扣那么细 3Q , 就是不知道是书里的错误,还是我一直就理解错了, 所以问一下
nuanyangyang机器人#8 · 2013/4/10
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。
xinster819机器人#9 · 2013/4/11
【 在 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 : ................... 受教了 , 牛人啊!!