黑马程序员技术交流社区

标题: 关于string类的小问题 [打印本页]

作者: 李节起    时间: 2012-4-7 14:36
标题: 关于string类的小问题

String s="a"+"b"+"c"+"d";

这条语句一共创建了多少个对象?

{:soso_e176:}


String s = new String("xyz");
创建了几个String Object?

作者: 郑涛    时间: 2012-4-7 14:49
String s="a"+"b"+"c"+"d";
这条语句一共创建了多少个对象?
这样写是无意义的。完全可以写成char数组。干嘛非得用String
String s = new String("xyz");
创建了几个String Object?
两个,一个是字符串对象,一个是指向这个字符串的引用对象。
作者: 欧阳才志    时间: 2012-4-7 14:55
我认为是五个,S肯定是一个,然后"a","b","c","d"在内存中肯定都会创建一次的,所以我认为是5个,不知道对不。

作者: 欧阳才志    时间: 2012-4-7 14:56
我认为是五个,S肯定是一个,然后"a","b","c","d"在内存中肯定都会创建一次的,所以我认为是5个,不知道对不。

作者: 刘宁    时间: 2012-4-7 14:57
答:对于如下代码:
                String s = "a" + "b" + "c" + "d";
                System.out.println(s == "abcd");
最终打印的结果应该为true。
javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。
String s = new String("xyz");
创建了两个,一个是字符串对象,一个是指向这个字符串的引用对象。
作者: 贠(yun)靖    时间: 2012-4-7 15:12
楼上的说的不错,补充一下:
   abcd四个字符串相加 在内存中是这样建立起来的
   先在内存的常量池中创建字符串a对象    s引用指向a  然后b过来 放在a的后面  这时候s 就指向ab对象   依次这样添加到常量池中  最终就是s指向常量池
中的abcd对象  所以最终会创建一个对象s   
  而 第二个   在基础视频中  毕老师的说法是会创建两个对象  一个在常量池中,一个在堆内存中
    但是到了高新视频中,张老师补充了一下  说有可能两个对象 有可能一个对象
因为 当String s = new String("xyz");
    这样new对象的时候  会先在常量池中找是否有xyz对象存在否  如果不存在 则创建xyz对象
   如果存在 就不创建了,  而在堆内存中只要new了 就一定创建对象,  所以说这个new出来到底是一个对象还是两个对象  要看实际情况的
作者: 贠(yun)靖    时间: 2012-4-7 15:12
楼上的说的不错,补充一下:
   abcd四个字符串相加 在内存中是这样建立起来的
   先在内存的常量池中创建字符串a对象    s引用指向a  然后b过来 放在a的后面  这时候s 就指向ab对象   依次这样添加到常量池中  最终就是s指向常量池
中的abcd对象  所以最终会创建一个对象s   
  而 第二个   在基础视频中  毕老师的说法是会创建两个对象  一个在常量池中,一个在堆内存中
    但是到了高新视频中,张老师补充了一下  说有可能两个对象 有可能一个对象
因为 当String s = new String("xyz");
    这样new对象的时候  会先在常量池中找是否有xyz对象存在否  如果不存在 则创建xyz对象
   如果存在 就不创建了,  而在堆内存中只要new了 就一定创建对象,  所以说这个new出来到底是一个对象还是两个对象  要看实际情况的
作者: pray    时间: 2014-4-26 04:09
让本拉登躲在山洞里还命令他手下冒着被美军发现的危险去上网下载来阅读的好帖




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