黑马程序员技术交流社区

标题: String s="a"+"b"+"c"+"d"; [打印本页]

作者: 陈波    时间: 2012-6-2 17:07
标题: String s="a"+"b"+"c"+"d";
String s="a"+"b"+"c"+"d";这条语句一共创建了多少个对象
作者: 刘伯阳    时间: 2012-6-2 17:23
就我个人分析应该是7个
"a" "b" "c" "d"每个都是一个对象,这是4个
然后按照结合顺序 "a"+"b" = "ab" 这是一个
然后 "ab"+"c" = "abc" 这是一个
"abc"+"d" = "abcd"这是一个
一共是7个
作者: 陈波    时间: 2012-6-2 17:31
刘伯阳 发表于 2012-6-2 17:23
就我个人分析应该是7个
"a" "b" "c" "d"每个都是一个对象,这是4个
然后按照结合顺序 "a"+"b" = "ab" 这是 ...

为什么不是一个对象呢 也可以理解为"a","b","c","d"已经在常量池中存在 他们相加之后只有“abcd” 一个字符串呢
作者: 黄克帅    时间: 2012-6-2 18:01
只有一个对象   里面装的就是 abcd
作者: 胡团乐    时间: 2012-6-2 18:07
String s="a"+"b"+"c"+"d";这条语句一共创建了多少个对象
单从String s=这一半看 是一个对象 后面是编译器会自动将字符相加 不会给他们再每个分配内存,要不这也太消耗资源了啊;
作者: 荣天    时间: 2012-6-2 18:25
一个对象
String s=new String("a"+"b"+"c"+"d");    2个对象
作者: 刘伯阳    时间: 2012-6-2 19:03
陈波 发表于 2012-6-2 17:31
为什么不是一个对象呢 也可以理解为"a","b","c","d"已经在常量池中存在 他们相加之后只有“abcd” 一个字 ...

可是你问的是创建了几个对象  而不是最终存在几个对象。
作者: 杨永峰    时间: 2012-6-2 20:51
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"的值。   
作者: 袁錦泰    时间: 2012-6-2 22:36
雅典娜MAX 发表于 2012-6-2 17:54
这个事情就不要纠结了,不同的编译器结果都不一样,现在的编译器已经非常智能了:

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

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

我就别百度了,麻烦你直接传给我一个,教教我怎么用.我以前看过百度,那上面太多,而且我也不知道怎么用. QQ:826288180




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2