[java基础]==、equals和hashCode()

来源:互联网 发布:启辰d60网络怎么开启 编辑:程序博客网 时间:2024/06/07 02:10

1 == 是比较运算符,既可以比较基本数据类型,又可以比较 引用数据类型,基本数据类型比较的是变量值,引用数据类型比较的是地址值,即比较两个对象是否指向同一块存储空间。
2 equals() 是Object类提供的方法,重写之前,equals()继承自Object类,底层实现使用的是“==”,比较的是地址值,但是比较地址值是没有意义的,我们需要重写equals()方法,用以比较属性值。
3 hashCode()也是Object类提供的方法,也可以用来判断两个对象是否相等。Object类的hashCode()返回的是对象在内存中的地址值转换成的int值,所以若hashCode()没有被重写过,任何两个对象的hashCode()值是不相等的。
4 equals() 重写一般需重写hashCode(),原因如下
1) 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2) 如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false) 。
5 注意包装类的equals 方法都是重写过的,所有包装类比较的都是值是否相同。String的hashCode()重写如下:

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;    }

基本类型的包装类的hashCode()返回的是其基本类型值;基本类型的包装类的equals()比较的是其基本类型值是否相等。

案例:

        String s1 = "1" + "23";        String s2 = new String(s1);        String s3= String.valueOf("123");        System.out.print("s1 == s2:");        System.out.println(s1 == s2);        System.out.print("s1 == s3:");        System.out.println( s1 == s3);        System.out.print("s1 == s3");        System.out.println( s3 == s2);        int i0 = 2;        Integer i1 = 2;        Integer i2 = new Integer(1);        System.out.print("i1 == i2:");        System.out.println(i1 == i2);        System.out.print("i0 == i2:");        System.out.println(i0 == i2);        System.out.print("i0 == i1:");        System.out.println(i0 == i1);
s1 == s2:falses1 == s3:trues1 == s3falsei1 == i2:falsei0 == i2:falsei0 == i1:true
1 0
原创粉丝点击