Given:
11. public String makinStrings() {
12. String s = “Fred47”;
13. s = s + “47”;
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
16. return s.toString();
17. }How many String objects will be created when this method is invoked?我觉得是5个,对不?^_^
11. public String makinStrings() {
12. String s = “Fred47”;
13. s = s + “47”;
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
16. return s.toString();
17. }How many String objects will be created when this method is invoked?我觉得是5个,对不?^_^
解决方案 »
- ArrayList 的删除的小问题,在线等
- 发个java聊天室代码,需要的看下
- 求助一些JAVA编辑TXT文本的小问题(搜索,替换等等..)
- java两个程序之间能不能使用互斥对象?
- while(true)如何退出循环?
- JAVA的Timer方面超难的问题!!!!望大家能帮忙!!谢谢
- 在用java的relection调用Object的某方法的时候,invoke(Object o,Object[] args)的args应该是什么参数?
- [200分]如何动态给通过LocateRegistry.createRegistry(动态端口);建立一个端口注册,预防和已注册的端口冲突(因为多个LocateRegist
- 菜鸟求教!!感激死我!!
- 帮忙!上传图片时,出错如下:
- 关于String类的charAt()与String数组结合使用的疑问
- java编译出现问题
所以,一旦重新赋值,那就一定不是原来的了!
不知道大家是否也这样认为.
12. String s = “Fred47”; 定义了一个对象“Fred47”,s是指向这个对象的一个引用
13. s = s + “47”; 先进行s + “47”,因为不可变性,又定义了一个对象s + “47”,把S指向了这个新增加的对象
14. s = s.substring(2, 5); 截取字符串一个新的对象
15. s = s.toUpperCase(); 又是一个新的对象
16. return s.toString();
17. }
干说无凭~
2: 47 data区
3:Fred4747 堆
4:ed4 堆
5:ED4 堆
共五个对象不知道这样对不对?
讲的非常清楚了
http://hi.baidu.com/xun1573/blog/item/42617ad8acb7333333fa1c9f.html
记住一个原则:String每次修改都会产生新的String,但是substring不产生新的String。11. public String makinStrings() {
12. String s = “Fred47”; //产生了一个
13. s = s + “47”; //又产生了两个
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
16. return s.toString();
17. }
正解:3个
记住一个原则:String每次修改都会产生新的String,但是substring不产生新的String。
11. public String makinStrings() {
12. String s = “Fred47”; //产生了一个
13. s = s + “47”; //又产生了一个
14. s = s.substring(2, 5);
15. s = s.toUpperCase(); //又产生了一个
16. return s.toString();
17. }
看substring的源代码最后是:return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);如果要的子串正好是原串的话的确是不产生新串了。不过这种情况太不常见了,大部分情况下还是要new
ye shi zhe yang xiang de
Fred47
47
Fred4747
ed4
ED4
只有toString()里面直接return this;不创建新对象。
说五个的人基本是理解了,但那两个字面值不一定是方法调用中产生的,如果执行ldc时在CONSTANT_String_info中已经存在那两个字面值,则ldc直接引用它们.
如果没有,则在方法调用的过程中创建并将这两个字面值拘留在池中,而其它三个String对象是肯定要在方法中产生的.所以准确地说是创建三到五个.
按照精华贴说的,应该是5个,我也觉得是5个额只是答案说是3个,是SCJP模拟题。
所以想请教一下。呵呵,也许是模拟题觉得两个池中的对象“可能”已存在,所以不算创建的?- -
因为出题的人自己并不真正懂,所以题目出现了偏差.比如在外部写一个main方法,直接调用makeString,这答案就是五个,因为main方法是JVM刚启动,之前CONSTAN_string_info入口还没有解析,所以五个字符串都是在这次方法调用中产生的.或者问在堆中产生几个对象,那就是确定的答案三个.
而本题的问题不可能知道在方法执行前字符串常量池是否有了那个常量.所以不可能知道是否要在方法调用时产生它们,所以三到五个才是正确的答案,这说明出题的人自己不明了了.另外什么精华贴之类的,很多都是在搞笑.
我今天也看了个scjp材料上的类似的问题,那上面举了个类似的例子,分析方法也类似。5个应该没问题。
但这么多个人把自己认真思考的观点发表出来,只有0分.
"scjp的模拟题答案有问题的很多。
我今天也看了个scjp材料上的类似的问题,那上面举了个类似的例子,分析方法也类似。5个应该没问题。"
这样的答案竟然是20分.楼主要想移分真正说明,骗那么多人进来讨论干什么呢?