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

 

 

 

 

 

 

發佈了88 篇原創文章 · 獲贊 16 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章