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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© skyname 中级黑马   /  2014-2-18 19:02  /  1397 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
为什么输出的第一个s1==s2是false,而s1.equals(s2)却会是true呢????到底==和调用equals方法之间有什么区别??????什么时候,或者说那种情况下使用哪个????请指教一下

评分

参与人数 1黑马币 +5 收起 理由
何伟超 + 5 这个题视频中讲过!

查看全部评分

9 个回复

倒序浏览
==是比较s1和s2的地址值 比较的是引用 这两个引用是不同的 equals比较的是两个引用指向的内容 即字符串 而字符串都是abc  所以是相同的
回复 使用道具 举报
可以参看毕老爷的视频  讲的很清楚  建议再看一看api文档  Java.lang.String类中的equals方法
回复 使用道具 举报
第一个s1==s2是false是因为建立了两个对象,然后==比较的是对象的引用地址是否相等?
很显然不等,所以是false
public boolean equals(Object anObject) {         //这是String里的equals复写的Object的equals方法
        if (this == anObject) {                             //如果对象的地址相同,返回真
            return true;
        }
        if (anObject instanceof String) {               //如果对象的内容也相同,返回真;否则返回假
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

   总结,==比较的是地址值,Object 里的equals就是比较的地址值;
   String 里的equals比较的是地址值和内容;
   如果你想比较字符串的内容就得用String里的equals方法。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
new一个新实例的话会分配新的内存空间。当你用==比较string时,比较的是s1与s2所指向内存区域是否一致,因为new了两次所以s1==s2返回false,而string重写了equal方法,采用的是按位比较,也就是比较具体内容,因此s1.equals(s2)返回的是true

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
代码中,s1,s2分别是String的两个对象引用,在栈内存中开辟,指向在堆内存中开辟的两个String对象,用十六进制地址值标示,假设s1=0X0012,s2=0x0056,所以是不相等的,所以结果是false,而equals()方法是String类中专门用来比较对象内容即字符串是否相同的方法,两个对象的内容都是"abc",所以结果是true。

QQ截图20140218202123.jpg (98.44 KB, 下载次数: 22)

QQ截图20140218202123.jpg
回复 使用道具 举报
徐君 中级黑马 2014-2-18 20:34:16
7#
==比较的是一个对象在内存中的地址值,equals它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
String s1=new String("abc");
String s2=new String("abc");如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样。equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
松涛小玮 发表于 2014-2-18 19:12
可以参看毕老爷的视频  讲的很清楚  建议再看一看api文档  Java.lang.String类中的equals方法 ...

是的,是的,我想起来,谢了,
回复 使用道具 举报
skyname 发表于 2014-2-18 21:51
是的,是的,我想起来,谢了,

不用谢  共同努力进步 帮助他人自己也能得到锻炼 加油
回复 使用道具 举报
首先equals里面也调用的==,equals是==的封装版本,第一个地址在比较,不同对象地址不同,第二个是比较内容,所以相同
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马