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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周朋飞 中级黑马   /  2012-6-26 10:56  /  2063 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周朋飞 于 2012-6-26 22:13 编辑

在回答别人问题的时候我也产生了一些疑惑
String s1 = new String ("abc");
                String s2 = new String ("abc");
                System.out.println(s1==s2);//false
                System.out.println(s1.equals(s2));//true
               
首先我并没有覆盖父类的equals方法,那么查看jdk源码发现 Object 的equals方法内部是这样
boolean equals(Object o){
  return this==o;
  }
这样,equal方法里面默认使用的也是==  ,那为什么就返回了false呢 传进去的不是也是个s2 的引用吗,是
s1的地址和s2不是不相等吗 为什么却返回true呢       
               

8 个回复

倒序浏览
s1.equals(s2)是调用的String的equals(),String类把Object类的equals()重写了,它比较的不是内存地址,是string的内容是否相等。
s1==s2是false,因为内存地址不同。
s1.equals(s2)因为都是"abc" 。
回复 使用道具 举报
String类已经重写了父类中的方法,只要使用string对象调用equals()那么就是重写后的方法   
equals()方法比较的是两个字符串对象的内容是否相同
回复 使用道具 举报
我很同意楼上同学的观点
回复 使用道具 举报
因为String 里面equals被重写,比较的是对象里面的内容是否相等
回复 使用道具 举报
System.out.println(s1==s2);//false//这个是比较两个对象的地址值,地址值不同所以是false
System.out.println(s1.equals(s2));//true//这个是比较两个对象的内容是否相同,由于内容相同,所以是true
回复 使用道具 举报
本帖最后由 余清兰 于 2012-6-26 13:07 编辑

String s1 = new String ("abc");
                String s2 = new String ("abc");
                System.out.println(s1==s2);//false
你这里创建的是两个不同的对象但内容相同的,你用s1==s2这两个变量名去比较,就相当于是两个名字相同的但人同的两个人去比较,它比较的是对象在堆内存中存储的地址值,所以是false
boolean equals(Object o){
  return this==o;
  }
this==o 这个是一个传递的实际参数变量内容跟当前对象的变量内容比较,所以equals是比较的对象内容
System.out.println(s1.equals(s2));它就返回的true
回复 使用道具 举报
吴琼 中级黑马 2012-6-26 13:13:33
8#
==
1:基本数据类型比较的是值是否相等.
2:引用数据类型比较的是地址值是否相等.题中创建了2个对象地址值肯定是不等的.
equals是比较地址值的,题中虽然没有重写equals方法,但是String类重写了比较的是值.建议你去看下String类中重写equals的源码下面是String重写的equals方法:
   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 赞一个!

查看全部评分

回复 使用道具 举报
嗯  我知道了 大家回答的都很好 我也查API 了
public String toString()返回此对象本身(它已经是一个字符串!)。

指定者:
接口 CharSequence 中的 toString
覆盖:
类 Object 中的 toString
返回:
字符串本身。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马