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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘真 中级黑马   /  2012-7-30 10:17  /  2158 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘真 于 2012-7-30 22:06 编辑

"=="和equals方法有什么区别啊?两者的使用范围是什么,就是说在哪种情况下使用"==",哪种情况下使用equals方法?

10 个回复

倒序浏览
==用来判断内容是否相同,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: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
回复 使用道具 举报
结果都一样是,当你调用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 11:02
equals用来判断地址是否相同的疑问
我测试了一下
public class Equals {

嗯,我的理解上面还是有些欠缺的。也是需要学习呢
回复 使用道具 举报
对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身,它比较的是两个变量的所指向的地址是否相同;而equals所比较的为变量所致地址中保存的值
回复 使用道具 举报
王峰 中级黑马 2012-7-30 15:16:01
7#
我再全面些,在字符串比较的情况下,前者是比较两个字符串变量所指向的内存地址是否相同,而后者是比较两个字符串变量的值是否相同
只有在整型比较的时候,==和equals才是相等的
回复 使用道具 举报
本帖最后由 艾衍年 于 2012-7-30 17:16 编辑



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 21:41
回复 使用道具 举报
简单一点的说,  当你需要判断值的物理内存地址是否相同的时候 就要用到"=="
然后 equals 当你需要判断 值的内容  是否相同的时候用到

点评

嗯,差不多明白了,谢谢哦!  发表于 2012-7-30 21:38
回复 使用道具 举报
陈红建 来自手机 中级黑马 2012-7-30 18:01:40
10#
java里面好像不能像c+哪样 if用==比较字符串。
回复 使用道具 举报
龚建锋 发表于 2012-7-30 13:34
结果都一样是,当你调用object类(根类)的equals的方法时,返回的对象的值还是两地址,也就同样相当于在比 ...

虽然我说的结果都一样,不是你说的那个意思,但是你给我的实例学习了,谢谢哦!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马