目錄
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