A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈波 中级黑马   /  2012-6-2 17:07  /  4100 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s="a"+"b"+"c"+"d";这条语句一共创建了多少个对象

11 个回复

倒序浏览
就我个人分析应该是7个
"a" "b" "c" "d"每个都是一个对象,这是4个
然后按照结合顺序 "a"+"b" = "ab" 这是一个
然后 "ab"+"c" = "abc" 这是一个
"abc"+"d" = "abcd"这是一个
一共是7个
回复 使用道具 举报
刘伯阳 发表于 2012-6-2 17:23
就我个人分析应该是7个
"a" "b" "c" "d"每个都是一个对象,这是4个
然后按照结合顺序 "a"+"b" = "ab" 这是 ...

为什么不是一个对象呢 也可以理解为"a","b","c","d"已经在常量池中存在 他们相加之后只有“abcd” 一个字符串呢
回复 使用道具 举报
只有一个对象   里面装的就是 abcd
回复 使用道具 举报
String s="a"+"b"+"c"+"d";这条语句一共创建了多少个对象
单从String s=这一半看 是一个对象 后面是编译器会自动将字符相加 不会给他们再每个分配内存,要不这也太消耗资源了啊;
回复 使用道具 举报
一个对象
String s=new String("a"+"b"+"c"+"d");    2个对象
回复 使用道具 举报
陈波 发表于 2012-6-2 17:31
为什么不是一个对象呢 也可以理解为"a","b","c","d"已经在常量池中存在 他们相加之后只有“abcd” 一个字 ...

可是你问的是创建了几个对象  而不是最终存在几个对象。
回复 使用道具 举报
String类中的value属性保存着String对象的值,是一个char类型的数组,执行 String a="abcd"时(假设字符串池中还不存在这个对象),JAVA虚拟机会在栈中创建四个char型的值'a','b','c','d',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c','d'},最后这个新创建的String对象会被添加到字符串池中。由于"a"   "b"  "c"  "d" 都是具体确定的字符串类型的值,所以在编译阶段 "a"+"b"+"c"+"d" 的结果已经确定,等价于“abcd",所以 执行 String s="a"+"b"+"c"+"d"; 和 String a="abcd"; 创建过程基本一样,只是多了一次 字符串的连接运算。 如果这样定义:
String b = "b"; 然后 Sring s = "a" + b + "c" +"d",由于b是变量,可能指向不同的字符串类型的值,所以必须到运行阶段才能确定"a" + b + "c" +"d"的值。   

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 赞一个!

查看全部评分

回复 使用道具 举报
雅典娜MAX 发表于 2012-6-2 17:54
这个事情就不要纠结了,不同的编译器结果都不一样,现在的编译器已经非常智能了:

下面这条语句一共创建了 ...

哥們兒,你這反編譯是怎麼搞的? 我當初問一個人他說是他同學幫他弄的,你這是怎麼搞的? 教教我.
回复 使用道具 举报
雅典娜MAX 发表于 2012-6-3 00:06
有反编译软件的百度一下好多好多  不过反编译软件只是做理论验证时会更有用些 ...

我就别百度了,麻烦你直接传给我一个,教教我怎么用.我以前看过百度,那上面太多,而且我也不知道怎么用. QQ:826288180
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马