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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范建海 中级黑马   /  2015-1-27 22:31  /  2493 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                                    String s1 = "ab";
                String s4 = "c";
                String s3 =s1 + s4;
                String s2 = "abc";
                System.out.println(s3 == s2);
这里结果为什么为false呢?最好能把程序执行的内存过程说说,谢谢了

11 个回复

倒序浏览
==号比较的是一个对象在内存中的地址值,String s1 = "ab";就是s1指向新new出一个对象“ab”,以下的s4,s3,s2也是一样指向新new的对象,所以s3==s2是false
回复 使用道具 举报
==用于比较引用和比较基本数据类型时具有不同的功能:

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

而在比较引用时,如果引用指向内存中的同一对象,结果为true
s1+s4相当于在内存中新开辟的地址,所以s3和s2并不指向同一对象,所以结果为false
回复 使用道具 举报
yueye13 来自手机 中级黑马 2015-1-27 23:50:47
板凳
String本身也是字符串对象,默认的比较方法是比较对象的首地址,
回复 使用道具 举报
这是引用类型比较的是地址值   可以用int【】数组验证
回复 使用道具 举报
用equals方法比较把.
回复 使用道具 举报
希冀 中级黑马 2015-1-28 20:15:45
7#
这是比较的对象地址  如果用equals比较的话比较的是对象的内容
回复 使用道具 举报
学习了。
回复 使用道具 举报
==用于比较的是两个对象的地址。
String s3 =s1 + s4;  这个在内存中创建了两个对象  在内存中开辟了2片空间  分配了2片内存地址。
而String s2 = "abc";只在内存中开辟了一个空间。
如果是  System.out.println(s2.equals(s3);这样打印的结果就是true了。
因为equals()比较的是两个字符串的内容是否相同。
回复 使用道具 举报
楼主,你用equals()来判断下,发现结果为true,当用equals()判断时,会比对s3和s2的hash码,hash码是根据这两个字符串的各项属性来计算得出的,如果hash码相同,那么就判断为同一个数据。
但你用==,比较的就只是引用地址。在API文档中写了:“Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 ”。也就是说s2,s3就像是两个实例化对象,s2在内存中占了一块空间,s3占了另一块空间,它们两的引用地址自然就不同,用==自然为false
回复 使用道具 举报
我记得好像是S3和S2虽然都是字符串儿,但是他们俩在内存中是独立存在,开辟的内存不一样。应该用equals()比较吧!
回复 使用道具 举报
你的赋值操作应该是对地址值得操作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马