黑马程序员技术交流社区

标题: “==”和equals方法? [打印本页]

作者: 刘真    时间: 2012-7-30 10:17
标题: “==”和equals方法?
本帖最后由 刘真 于 2012-7-30 22:06 编辑

"=="和equals方法有什么区别啊?两者的使用范围是什么,就是说在哪种情况下使用"==",哪种情况下使用equals方法?
作者: 王渠    时间: 2012-7-30 10:26
==用来判断内容是否相同,equals用来判断地址是否相同。

例如
String a = new String("ABC");
String b = "ABC";
a==b//是真。因为都是ABC
a.equals(b)是false,因为a是new对象出来的一个值,地址值和b是不同的。

equals方法是可以被复写的,根据需求自己定义判断规则,比如说有Person类
你就可以定义自己的equals,当姓名。年龄都相等的时候才是真,否则为假。
作者: 刘真    时间: 2012-7-30 11:02
本帖最后由 刘真 于 2012-7-30 11:05 编辑
王渠 发表于 2012-7-30 10:26
==用来判断内容是否相同,equals用来判断地址是否相同。

例如


equals用来判断地址是否相同的疑问
我测试了一下
public class Equals {
public static void main(String[] args) {
        String a=new String("ABC");
//        String b=new String("ABC");
        String b="ABC";
        if(a==b)
                System.out.println("a=b");
        if(a.equals(b))
                System.out.println("a.equals(b)");
}
}
好像你举的列子,结果错了,测试一下,两次结果一样


2OU{]]$KD9O6`5]R(]O[M_R.jpg (6.15 KB, 下载次数: 23)

2OU{]]$KD9O6`5]R(]O[M_R.jpg

作者: 龚建锋    时间: 2012-7-30 13:34
结果都一样是,当你调用object类(根类)的equals的方法时,返回的对象的值还是两地址,也就同样相当于在比较a==b.这时候我们要重写equals方法。楼主请看下面的实例学习:
class EqualsDemo {
       
        public static void main(String[] args) {
                /*
                String s1 = new String("abc");
                String s2 = new String("abc");
                System.out.println(s1 == s2);                        // 使用==比较两个对象时, 是比较两个对象地址是否相同
                System.out.println(s1.equals(s2));                // 调用equals方法比较两个对象是否相同
                */
               
               
                Person p1 = new Person("张三", 19);
                Person p2 = new Person("张三", 19);
                System.out.println(p1);                                        // 打印toString返回值
                System.out.println(p2);
                System.out.println(p1 == p2);                        // 比较是否地址相同
                System.out.println(p1.equals(p2));                // 使用自定义的equals比较属性是否完全相同
        }       
       
}

class Person {
        private String name;
        private int age;
       
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }       
        public String toString() {        //重写toSting()方法,让输出时不输出地址而是字符串
                return "Person(" + name + ", " + age + ")";       
        }
       
        public boolean equals(Object obj) {           // 重写equals()方法
                Person other = (Person)obj;                // 为了访问name和age, 先将Object类型的实参强转回Person类型
                if (this.name != other.name)        // 如果name不同, 返回false
                        return false;
                if (this.age != other.age)                // 如果age不同, 返回false
                        return false;
                return true;                                        // 上面如果没有返回, 就代表属性都相同, 返回true
        }
       
}
作者: 王渠    时间: 2012-7-30 14:52
刘真 发表于 2012-7-30 11:02
equals用来判断地址是否相同的疑问
我测试了一下
public class Equals {

嗯,我的理解上面还是有些欠缺的。也是需要学习呢
作者: 王峰    时间: 2012-7-30 15:12
对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身,它比较的是两个变量的所指向的地址是否相同;而equals所比较的为变量所致地址中保存的值
作者: 王峰    时间: 2012-7-30 15:16
我再全面些,在字符串比较的情况下,前者是比较两个字符串变量所指向的内存地址是否相同,而后者是比较两个字符串变量的值是否相同
只有在整型比较的时候,==和equals才是相等的

作者: 艾衍年    时间: 2012-7-30 15:51
本帖最后由 艾衍年 于 2012-7-30 17:16 编辑

[attach]5384[/attach]

public class TeatEquals
{
    public static void main(String[] args)
    {
     String str1 = "ABC";
     String str2 = new String("ABC");

     System.out.println(str1 == str2);     //比较的是地址值,str2是又new的一个对象。
     System.out.println(str1.equals(str2));//这个比较的是内容,
    }
}

图一是Object类里的equals方法。
下图是String里的equals方法。

4433.jpg (101.84 KB, 下载次数: 24)

4433.jpg

作者: 张云杰    时间: 2012-7-30 17:12
简单一点的说,  当你需要判断值的物理内存地址是否相同的时候 就要用到"=="
然后 equals 当你需要判断 值的内容  是否相同的时候用到
作者: 陈红建    时间: 2012-7-30 18:01
java里面好像不能像c+哪样 if用==比较字符串。

作者: 刘真    时间: 2012-7-30 21:37
龚建锋 发表于 2012-7-30 13:34
结果都一样是,当你调用object类(根类)的equals的方法时,返回的对象的值还是两地址,也就同样相当于在比 ...

虽然我说的结果都一样,不是你说的那个意思,但是你给我的实例学习了,谢谢哦!




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