浅谈equals和==

在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗?

  首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现就是==;

public boolean equals(Object obj) {
        return (this == obj);
    }

如果是比较两个Object对象的大小,直接用==就可以了。

==

1、判断比较的两个对象是否是同一个对象,内存地址是否相同
2、比较的两个对象必须是同一类型的数据,否则编译不通过。
3、如果是数字的比较,比较的是数值是否相等:

equals

1、equals用来比较的是两个对象的内容是否相等,

2、由于所有的类都是Object类的子类,如果一个类没有对该方法进行覆盖的话,在使用该方法时会调用Object类中的方法。

  当我们用new创建一个对象的时候,会开辟一个新的地址,所以用==作比较时,回返回false。但是String重写了Object的equals方法,当创建两个相同值的String对象时,调用equals方法返回true。String类也比较特殊,它可以直接赋值产生对象,在比较两个String对象的时候,如果String对象都是直接赋值产生的,它们用==作比较的时候,就会返回true。例如:String s1 = “abc”,因为String是引用类型,s1中只是存放了地址,而值不是new出来的,被系统存放在常量池中,而不是在存放在堆中,这时候再创建一个s2=“abc”,因为同样是要放在常量池中,创建s2时发现常量池中已经存在同样的数据,直接把s2指向了该数据,所以s1和s2指向同一块地址

String类重写的equals方法如下:

public boolean equals(Object anObject) {
        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;
    }

对String的验证代码如下所示:

public static void main(String[] args) {
        String s1,s2,s3,s4,s5;

        s1=new String("we are students");
        s2="we are students";
        s3=new String("we are students");
        s4=new String(s1);
        s5 = "we are students";

        System.out.println(s1.equals(s2));
        System.out.println(s1==s2);
        System.out.println(s1==s3);
        System.out.println(s1.equals(s4));
        System.out.println(s1==s4);
        System.out.println(s2==s5);

    }

输出结果如下所示:
true
false
false
true
false
true

如果是我们自己写的类,要按照属性比较两个对象是否相等时,需要重写equals方法,否则会直接调用Object的方法,判断两个对象的地址是否相等。

另外,"=="比"equals"的运行速度快,因为"=="只是比较引用的地址。

  

posted @ 2018-07-10 22:09  卡洛小豆  阅读(176)  评论(0编辑  收藏  举报