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