论坛首页 入门讨论版

一个关于String的问题?到底产生了多少个对象??(附图)

浏览 1543 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2007-09-17 关键字: String问题
String s = new String("abc"+"bcd");
这句话执行之后产生了多少个对象呢?
字符串常量是对象吗?
我觉得是产生了一个对象,想听听各位的意见。我是这么想的:
我觉得字符串常量不是对象,先是“abc"和"bcd"连接成"abcbcd"然后s指向连接之后的新字符串常量 。
这样对吗?
内存图如下:
  • 7560e19e-0206-4a83-ad99-c34e80e61ea7-thumb
  • 描述: 内存图
  • 大小: 55.6 KB
   
最后更新时间:2007-09-17
4个,字符串也是对象。
   
0 请登录后投票
最后更新时间:2007-09-17
那么String s = "abc";
请问调用了String的那个构造方法???
   
0 请登录后投票
最后更新时间:2007-09-17
不用构造方法,编译器识别双引号,然后在内存里创建了一个对象。
   
0 请登录后投票
最后更新时间:2007-09-17
这种问题就太扯了...
多少个对象??
自己去看String的源代码吧,new 一个String估计内部至少会new一个char数组,这是一个对象;String自己也是一个对象.已经至少两个对象了.
   
0 请登录后投票
最后更新时间:2007-09-17
搜一下就很多啦,
   
0 请登录后投票
最后更新时间:2007-09-17
要想准确回答到底几个对象的问题, 得把JVM规范中class file格式考虑进来, 这种字符串字面值最终会被编译到 .class 文件的常量池里去, 运行期通过ClassLoader载入. 另外还要考虑编译器优化, SUN JDK会把 "abc" + "bcd" 自动优化成一个 "abcbcd" 常量值, 因为对程序语义没有改变. 但其他java编译器, 比如jikes, gcj就不一定.
   
0 请登录后投票
最后更新时间:2007-09-17
,但是我觉得是四个对象"abc","bcd","abcbcd",然后new(“abcbcd”);
   
0 请登录后投票
最后更新时间:2007-09-18
String s = new String("abc"+"bcd");

5个对象:
  4个String对象: "abc", "bcd", "abcbcd" 还有用new强制生成的另一个"abcbcd"
  1个StringBuffer对象(在JDK 5以上会是StringBuilder):用于连接String。

BTW,强烈建议不要用new来生成String, 因为,这样会每次生成一个新的String对象,即使jvm相应的cache中已经存在相同value的String对象。
   
0 请登录后投票
最后更新时间:2007-09-18
人家显然问的是String对象,说什么char ,StringBuffer的很无聊,干嘛不说byte呢
   
0 请登录后投票
论坛首页 入门讨论版

跳转论坛:
JavaEye推荐