天天看點

Kotlin-17-等号比較(== 、===)

目錄

1、Java中的 ==

2、Java中的 equals()

3、兩者的差別

3、對于基本資料類型的==比較

4、Kotlin中的== 與 ===

1、Java中的 ==

Java中的== 直接比較的是兩個對象的堆記憶體位址,如果相等,則說明這兩個引用實際上指向的是同一個對象位址的。

2、Java中的 equals()

Java中的equals() 比較會先看兩個對象是否指向于同一個對象位址,如果不是,則比較兩個對象的屬性值是否相等。

下面Dog實體類中的equals()方法是Java中對實體類的通用重寫。從下面可以看出,當我們調用equals()比較的時候,會先比較兩個對象是否==,然後會比較兩個對象的屬性值是否相等,如果相等,就會傳回true。

public class Dog {
    String name;
    int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dog)) return false;

        Dog dog = (Dog) o;

        if (age != dog.age) return false;
        return name != null ? name.equals(dog.name) : dog.name == null;
    }
}
           

3、兩者的差別

  •    == 就隻比較兩個對象指向的記憶體位址是否一樣
  •   equals()比較的是兩個對象的屬性值是否一樣
Dog dog1=new Dog("小黑",3);
  Dog dog2=new Dog("小黑",3);

  System.out.println("dog1==dog2        : "+(dog1==dog2));
  System.out.println("dog1.equals(dog2) : "+dog1.equals(dog2));

  //輸出結果
   dog1==dog2        : false
   dog1.equals(dog2) : true
           

3、對于基本資料類型的==比較

對于基本的資料類型(byte,int ,short,char ,float ,double,long,boolean )來說 ,它們是作為常量在方法區的常量池裡面以HashSet政策存儲起來的,對于字元串"abc" 來說,一個常量隻會對應一個位址,無論有多少個"abc",都隻會存儲在一個位址,是以它們的引用都隻會指向同一個位址, 基本的資料類型和String常量是可以用 == 直接比較的

從下面可以看出name1和name2 看似是建立了兩個對象,但是其實他們的值 “ZhangSan” 所在常量池中的記憶體位址是一樣的,是以他們的結果一樣。

注意:new String() 會将 name3對象存放在堆記憶體中,而不是常量池中,是以他們的記憶體位址是不一樣的。隻要是通過new出來的對象都會存放在堆記憶體中。如果不是很了解,可以看一些記憶體的文章。
String name1 = "ZhangSan";
 String name2 = "ZhangSan";
 String name3 = new String("ZhangSan");

 System.out.println("name1==name2         :  "+(name1==name2));
 System.out.println("name2==name3         :  "+(name3==name2));
 System.out.println("name1==name3         :  "+(name1==name3));
 System.out.println("name1.equals(name3)  :  "+name1.equals(name3));

  //輸出結果
  name1==name2         :  true
  name2==name3         :  false
  name1==name3         :  false
  name1.equals(name3)  :  true
           
對于基本資料的包裝類型(Byte,Short,Character,Integer,Float,Double,Long,Boolean)除了Float和Double之外,其他六種都是實作了常量池的,是以對于這些類型,也可以通過 == 來判斷是否相等.
Integer age1=127;
  Integer age2=127;
  Integer age3=128;
  Integer age4=128;

  System.out.println("age1==age2         :  "+(age1==age2));
  System.out.println("age3==age4         :  "+(age3==age4));

  //輸出結果
  age1==age2         :  true
  age3==age4         :  false

           
因為Integer在常量池的存儲範圍是[-128,127],在這個範圍内是直接存儲到常量區的,超出這個範圍則會在堆記憶體中建立一個新的對象的來儲存這個值,因而m,n指向了兩個不同的對象位址,因而不相等.

4、Kotlin中的== 與 ===

== 對應于Java中的 equals() 

===對應于 Java中的 ==

val person1 = Person("ZhangSan", 18)
 val person2 = Person("ZhangSan", 18)

 println("person1 === person2 : ${person1 === person2}")
 println("person1 == person2  : ${person1 == person2}")

 val dog1 = Dog("小黑", 3)
 val dog2 = Dog("小黑", 3)

 println("dog1==dog2          : " + (dog1 === dog2))
 println("dog1.equals(dog2)   : " + (dog1 == dog2))

//輸出結果
 person1 === person2 : false
 person1 == person2  : true
 dog1==dog2          : false
 dog1.equals(dog2)   : true