黑马程序员技术交流社区

标题: 【已解决】关于对象创建的问题 [打印本页]

作者: 黄树人    时间: 2012-9-21 23:42
标题: 【已解决】关于对象创建的问题
本帖最后由 黄树人 于 2012-9-22 18:40 编辑

对于如下代码:
     String s1 = "a";

     String s2 = s1 + "b";

     String s3 = "a" + "b";

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

     System.out.println(s2 == "ab");

     System.out.println(s3 == "ab");

    System.out.println(s == "abcd");
这断代码在运行时,打印的是false true true
代码创建S1对象把字符串“a”赋值给了S1,然后把S1和“b”共同组成的字符串赋值给了S2
s1和s2代码的值都是“ab”啊,按理第一个输出语句应该也答应true啊,可为什么打印出了false呢
还有这段代码中一共创建了多少个对象呢?

作者: 霍永刚    时间: 2012-9-22 00:40
s1,s2,s3,s各自有一个对象所以是四个对象。
==是地址比较,equals是值比较 。
因为他们的值是相同的,但是他们的物理地址不同,不是一个对象,并不能认为是完全的相等(“==”)。
java中字符串比较推荐用equals,例如s2.equals("ab") 。
所以打印的是false true true

作者: 董志超    时间: 2012-9-22 07:33
==,比较的是地址值,“a”+“b”=="ab",如果已有字符串对象“a”+“b”了,在创建字符串对象“ab”,他俩的地址值是一样的,也就是说内存中只有一个对象,节省资源。

String s1="abc";
String s2="abc";
System.out.println(s1==s1);//true
所以后两个是true,true

String s1="a";
String s2=s1+"bc";
String s3="abc";
System.out.println(s2==s3);//false
看看视频,毕老师视频String那开头讲过
作者: 张忠豹    时间: 2012-9-22 16:17
对于如下代码:
    String s1 = "a";

     String s2 = s1 + "b";

     String s3 = "a" + "b";

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

     System.out.println(s2 == "ab");

     System.out.println(s3 == "ab");

    System.out.println(s == "abcd");

第一条语句打印的结果为false,第二条语句打印的结果为true,第三条语句打印的结果是true,这说明JVM可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果

作者: 赵永康    时间: 2012-9-22 18:26
String s1 = "a";

     String s2 = s1 + "b";//此时s2并不知道s1会赋予什么值,是个未知的。他只是将引用付给了s2     String s3 = "a" + "b";//其实s3="ab";你这样的写法,就是java虚拟机在识别的时候,直接给操作了
    String s = "a" + "b" + "c" + "d";//同上原理

     System.out.println(s2 == "ab");//所以是false

     System.out.println(s3 == "ab");//true

    System.out.println(s == "abcd");//true
这个情况在张孝祥老师的基础加强里面提及到过,你可以再看看




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