【Java】==運算符與equals()方法 比較值、比較引用

==與equals()方法

基礎數據類型

引用數據類型

1、==運算符

(1)基本數據類型比較值:只要兩個變量的值相等,即爲true

注意:當基本數據類型使用“==”進行比較時,符號兩邊的數據必須類型兼容(類型相同或可自動類型轉換),否則編譯出錯;

public class TestDemo {
    public static void main(String[] args) {
        double d = 2.0;
        int i = 2;
        int j = 2;
        String str = "2";
        System.out.println(i == j);//true
        System.out.println(i == d);//true

        //編譯出錯  編譯都過不了
//        System.out.println(str == i);//Operator '==' cannot be applied to 'java.lang.String', 'int'
//        System.out.println(str == d);//Operator '==' cannot be applied to 'java.lang.String', 'double'
    }
}

(2)引用類型比較引用:比較兩個對象的地址值,兩個引用變量指向同一個對象的堆空間時,才爲true

Person p1=new Person();

Person p2=new Person();

if(p1==p2) //false

p1=p2;//如果有這樣的賦值語句後 if(p1==p2) //true

public class Person {
   private String name;
   private int age;

   public static void main(String[] args) {
       Person p1 = new Person();
       Person p2 = new Person();
       System.out.println(p1 == p2);//false
       p1 = p2;
       System.out.println(p1 == p2);//true
   }
}

注意:當引用類型使用“==”進行比較時,符號兩邊的數據類型必須兼容(類型相同或有父子類關係),否則編譯出錯;

Person p=new Person();

String str=“hello”;

if(p==str)//錯誤,p和String類型不兼容,Person和String類型無父子類關係

public class Person {
   private String name;
   private int age;

   public static void main(String[] args) {
       Person p1 = new Person();
       Person p2 = new Person();
       System.out.println(p1 == p2);//false
       p1 = p2;
       System.out.println(p1 == p2);//true

       Person p = new Person();
       String str = "hello";
//        System.out.println(p == str);//錯誤,p和String類型不兼容,Person和String類型無父子類關係
   }
}

Student stu = new Student();//Student extends Person

if(p==stu)//編譯通過

public class Student  extends Person{
   public static void main(String[] args) {
       Person person = new Person();
       Student student = new Student();//Student extends Person
       
       //編譯通過
       System.out.println(person == student);//false
   }
}

2、equals方法

格式:obj1.equals(obj2)

(1)equals():所有類都繼承了Object,也就獲得了equals()方法。

(2)自定義類可以重寫equals方法

注意:如果一個類型沒有重寫過equals方法,那麼調用equals等價於==

說明:當用equals()方法進行比較時,對類File、String、Date及包裝類(Wrapper Class)來說,是比較類型及內容;原因是在這些類中重寫了Object類的equals()方法。

重寫equals()方法的原則:

l 對稱性:如果x.equals(y)返回是“true”,那麼y.equals(x)也應該返回是“true”。

l 自反性:x.equals(x)必須返回是“true”。

l 類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那麼z.equals(x)也應該返回是“true”。

l 一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重複x.equals(y)多少次,返回都是“true”。

l 任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。

public class Student  extends Person{
   public static void main(String[] args) {
       Person person = new Person();
       Student student = new Student();//Student extends Person

       //編譯通過
       System.out.println(person == student);//false
       System.out.println(person.equals(student));//false

       System.out.println("-----------");
       String str1 = "hello";
       String str2 = "hello";
       String str3 = new String("hello");
       System.out.println(str1 == str2);//true
       System.out.println(str1 == str3);//false
       System.out.println(str1.equals(str2));//true
       System.out.println(str1.equals(str3));//true

       System.out.println("------------");
       String str4 = "java";
       System.out.println(str4 == "java");//true
       System.out.println(str4.equals("java"));//true
       System.out.println("java".equals(str4));//true
       System.out.println(str4.equals(str4));//true
       System.out.println(str4.equals(null));//false
       System.out.println("j".equals('j'));//false


   }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章