黑马程序员技术交流社区

标题: java问题 [打印本页]

作者: 范建海    时间: 2015-1-27 22:31
标题: java问题
                                    String s1 = "ab";
                String s4 = "c";
                String s3 =s1 + s4;
                String s2 = "abc";
                System.out.println(s3 == s2);
这里结果为什么为false呢?最好能把程序执行的内存过程说说,谢谢了
作者: 潇洒小哥    时间: 2015-1-27 22:44
==号比较的是一个对象在内存中的地址值,String s1 = "ab";就是s1指向新new出一个对象“ab”,以下的s4,s3,s2也是一样指向新new的对象,所以s3==s2是false
作者: sq_jun    时间: 2015-1-27 23:29
==用于比较引用和比较基本数据类型时具有不同的功能:

比较基本数据类型,如果两个值相同,则结果为true

而在比较引用时,如果引用指向内存中的同一对象,结果为true
s1+s4相当于在内存中新开辟的地址,所以s3和s2并不指向同一对象,所以结果为false
作者: yueye13    时间: 2015-1-27 23:50
String本身也是字符串对象,默认的比较方法是比较对象的首地址,
作者: 朋好友    时间: 2015-1-28 00:13
这是引用类型比较的是地址值   可以用int【】数组验证
作者: 梁小刀11    时间: 2015-1-28 20:02
用equals方法比较把.
作者: 希冀    时间: 2015-1-28 20:15
这是比较的对象地址  如果用equals比较的话比较的是对象的内容
作者: 周景新    时间: 2015-1-28 21:06
学习了。
作者: 我为你着迷    时间: 2015-1-28 21:29
==用于比较的是两个对象的地址。
String s3 =s1 + s4;  这个在内存中创建了两个对象  在内存中开辟了2片空间  分配了2片内存地址。
而String s2 = "abc";只在内存中开辟了一个空间。
如果是  System.out.println(s2.equals(s3);这样打印的结果就是true了。
因为equals()比较的是两个字符串的内容是否相同。
作者: 俺做android开发    时间: 2015-1-28 21:44
楼主,你用equals()来判断下,发现结果为true,当用equals()判断时,会比对s3和s2的hash码,hash码是根据这两个字符串的各项属性来计算得出的,如果hash码相同,那么就判断为同一个数据。
但你用==,比较的就只是引用地址。在API文档中写了:“Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 ”。也就是说s2,s3就像是两个实例化对象,s2在内存中占了一块空间,s3占了另一块空间,它们两的引用地址自然就不同,用==自然为false
作者: 流行VS泪痕    时间: 2015-1-28 22:29
我记得好像是S3和S2虽然都是字符串儿,但是他们俩在内存中是独立存在,开辟的内存不一样。应该用equals()比较吧!
作者: 丶人世百态    时间: 2015-1-28 22:39
你的赋值操作应该是对地址值得操作




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