比较“==”和equals

来源:互联网 发布:windows无iis安装 编辑:程序博客网 时间:2024/05/18 13:42

Object的“==”和equals

“==”比较的是引用的地址值;

equals调用的也是“==”这个方法,源码如下:

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

所以,如果我们对三个对象o1、o2、o3做比较,结果如下:

Object o1 = new Object();Object o2 = new Object();Object o3 = o2;System.out.println(o1.equals(o2)); // falseSystem.out.println(o1==o2); // falseSystem.out.println(o3.equals(o2)); // trueSystem.out.println(o3==o2); // true

String的“==”和equals

String继承与Object,所以他的==和上面的结果一致,对比的也是对象的引用地址;

String重写了equals方法,比较的是String所代表的字符值;

源码:

    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;    }    public int hashCode() {        int h = hash;        if (h == 0 && value.length > 0) {            char val[] = value;            for (int i = 0; i < value.length; i++) {                h = 31 * h + val[i];            }            hash = h;        }        return h;    }
所以对s1,s2,s3的比较有如下结果:

String s1 = new String("aaaaaaa");String s2 = new String("aaaaaaa");String s3 = s2;System.out.println(s1==s2); // falseSystem.out.println(s1.equals(s2)); // trueSystem.out.println(s3==s2); // trueSystem.out.println(s3.equals(s2)); // true


结论

1、基本类型“==”比较的为值比较,对象“==”比较的是对象引用地址的比较

2、Object.equals比较的为对象引用地址比较,String.equals比较的为引用的字符值;

3、基本类型对应的对象引用,和String一致,即equals比较的也是值比较。


补充知识:

1、hashCode()和(“==”、equals)没关系,作用是:在为对象进行散列的时候,作为key值输入,所以我们的对象的hashCode()尽量不要相同。

2、Object默认提供的实现是:在内存地址的基础上通过特定算法得出的,保证了hash值的不同。


当我们看到hashCode的时候,难道不应该想到hashMap、hashSet等和hash有关的类吗?还是就是重写equals()和hashCode()d的话题。这些另起一片文章来说吧。


0 0
原创粉丝点击