==和equals方法的区别和联系

1、==

(1)基本数据类型:比较的是值是否相等

   int a=1;
   int b=1;
   System.out.println(a==b);

返回true。

(2)引用数据类型,比较的是是否为同一对象:

        Student student1=new Student("201911","zhai");
        Student student2=new Student("201912","zhang");
        System.out.println(student1==student2);

返回false。

两个对象的引用分别指向不同的对象。

        Student student1=new Student("201911","zhai");
        Student student2=new Student("201912","zhang");
        System.out.println(student1==student2);

返回true。

对象的引用虽然不同,但是他们指向的是同一个对象。

2、equals()方法

(1)equals()方法不能作用于基本数据类型的变量

(2)equals()方法作用于引用数据类型,比较的是是否为同一对象:

equals继承自Object类,查看源码:

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

可以看出,其实质是用==比较引用数据类型是否为同一对象。

(3)有些类对equals方法进行了重写(例如:String类):

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

比较的是对象的值,而不是对象是否为同一对象。

        String string1=new String("jiayou");
        String string2=new String("jiayou");
        System.out.println(string1.equals(string2));//true
        System.out.println(string1==string2);//false

因为分别创建了两个对象,对象的引用分别指向自己的对象,虽然两个对象的值相等,但是两个对象不是同一个对象(对象的地址不同)。

(4)自定义equals方法,比较对象的值是否相等:

public boolean equals(Object obj) {
        // 判断当前对象和传递的对象,如果是同一个对象直接通过
        if (this == obj) {//引用数据类型,比较的是是否为同一对象
            return true;
        }
        // 判断传递进来的对象是否是Vehicle类型,不是的话直接pass
        if (!(obj instanceof Vehicle)) {
            return false;
        }
        // 将obj向下转型为Vehicle引用,可以访问Vehicle特有内容,否则只能访问共有内容
        Vehicle v = (Vehicle) obj;
        return this.vType == v.vType && this.vNum == v.vNum;//基本数据类型,比较的是基本数据类型的值
    }

对equals方法进行重写后,equals方法的功能由比较两个对象是否为同一对象变为对象的值是否相等。

猜你喜欢

转载自www.cnblogs.com/zhai1997/p/12398258.html