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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 布鲁Go 中级黑马   /  2013-12-28 22:49  /  1158 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 布鲁Go 于 2013-12-29 18:53 编辑

看视频的时候,“==”号和“equals” 经常把我搞得很晕,后来看到一篇文章是这样分析的:
基本数据类型,用==比的就是他们的值。
引用数据类型,用==比的就是他们的内存地址。
object  的equals方法底层也是==号,所以,如果类中的equals没有被复写过,就和==号相同,而复写了 按复写了的算。

复写过equals的类有:
java.io.file     j ava.util.Date     java.lang.string        包装类(Integer,Double等)————(恩,感觉总结的应该不全)


恩,看完瞬间觉得思路清晰,一切明了。。。就是不太敢确定是不是确实就这样,但至于什么时候用==,什么时候equals 还是不太确定。
我一直觉得java这里设计的很奇怪。
比如你把所有基本数据类型都用==比,然后引用数据类型都用“equals”来比不就好了,默认就是 比较两个对象内容是否相等。  
毕竟比较地址值的应用感觉比较少,非要比的话,对象后面再    .    一个hashcode不就好了。。
目前这样要判断内容是否相等,一会儿复写这个,一会儿复写那个感觉有点复杂。
恩,当然java发展到现在肯定有考虑过类似问题,以上纯属新手吐槽,不知道有没有高手把这两个理解的更深入更透彻的。。

譬如能讲明白为什么要设计这样的两个东东,具体在什么时候用哪个比较好之类的。。。。求指点,拜谢。。。。

评分

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

查看全部评分

3 个回复

正序浏览
源码面前,一目了然:
Object里的equals方法:
public boolean equals(Object obj) {
        return (this == obj);
    }
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.equals方法可以被重写,而且推荐将euqals和hashcode两个方法一起重写,之后比较的是hashcode,
  不重写equals方法的话,会调用父类的equals方法,追溯到Object的话 euqals 就是 ==
   ==这个不能被重写,比较的是是否指向同一个对象实例
2.equals方法的参数是Object,所以两者不需要是同一类型的对象
  ==如果两者不是相同类型,编译器会报错
例如:
class  Demo
{
         public static void main(String[] args)
        {
              Person p1=new Person("zhansan",20);
              Person p2=new Person("zhansan",20);
              System.out.println(p1.equals(p2)+"---"+(p1==p2));//false false   
/*
equals是Object类中的方法,是判断对象是否相同,即判断地址是否一样 ,所以p1.equals(p2)结果是false;而==是比较运算符,p1和p2是各指向两个对象,因此结果为false
*/
             String s1=new String("lisi");
             String s2=new String("lisi");
             System.out.println(s1.equals(s2)+"---"+(s1==s2));//true false
/*
字符串中的equals方法是重写了object中的equals方法,判断两个字符串是否相同。所以s1.equals(s2)结果是true;而s1和s2是各指向两个字符串变量,因此为false
*/
             String s3="lisi";
             System.out.println(s1.equals(s3)+"---"+(s1==s3));//true false
/*
这其中涉及到了字符串引用型变量实例化时,先查询内存中是否已经有“lisi”字符串对象,如果有了,则指向该对象。否则,新建字符串对象。所以s1.equals(s3)结果是true,而s1!=s3与第二种情况相同。
*/
        }
}
class Person
{
         private String name;
         private int age;
         Person(String name,int age)
         {
                 this.name=name;
                 this.age=age;
         }
}

评分

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

查看全部评分

回复 使用道具 举报
留个记号,我发帖问过类似的问题,同样期待有高手把这两个解释的更深入更透彻
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马