java 雙等號(==) 與equals方法的介紹和區別
1.基本數據類型與equals方法
- == 用于比較基本數據類型時,比較的是值
- ==用于比較引用數據類型時,比較的是地址
- equals方法在Object類中比較的也是地址,因為在低層也是使用==進行比較
- String類調用equals方法比較的內容,因為String類對equals方法進行了重寫,改為了比較字符串的內容
package com.qfedu.test2;
/*** == 與 equals方法區別* @author **/
public class Person {private String name;private String idCard;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard = idCard;}public Person(String name, String idCard) {this.name = name;this.idCard = idCard;}public Person() {}public static void main(String[] args) {Person p1 = new Person("張三","abcd");Person p2 = new Person("張三","abc");//== 比較的是地址 falseSystem.out.println(p1 == p2);//Object類中equals方法低層使用的也是 == 所以比較的也是地址 打印false System.out.println(p1.equals(p2));System.out.println("======================");//String 也是一個類 可以創建對象并賦值String str1 = new String("abc");String str2 = new String("abc");//==比較的是地址 falseSystem.out.println(str1 == str2);//String 中重寫的equals方法 比較的是內容 輸出trueSystem.out.println(str1.equals(str2));}}
2.String類中:
String 對象直接使用等號賦值,會將值存儲在方法區的字符串常量池中
String使用等號直接賦值時,在存放之前,會先檢查常量池中是否有相同的字符串內容,如果存在,直接使用已存在字符串內容,如果不存在,將以一個新的地址存放在常量中
注意:如果通過new對象進行賦值,每個對象都會是一個新的地址
public class Test1 {public static void main(String[] args) {//String 在方法區有一個存儲字符串的常量池,存放之前會檢查常量池是否存在,//存在的話直接使用,所以地址相同String str1 = "121";String str2 = "121";//new 對象直接在堆中 每次創建都會產生一個地址String str3 = new String("121");String str4 = new String("121");System.out.println(str1 == str2);System.out.println(str3 == str4);System.out.println(str2 == str3);}
}
3.整數包裝類中
- 數值包裝類,取值在byte(-128~127)之間,直接使用等號(=)賦值時,多個對象比較,結果為true,超過范圍為false
- char類型也遵循這個規則
public class Test1 {public static void main(String[] args) {Integer i1 = 12;Integer i2 = 12;System.out.println(i1==i2);//true//浮點型不適用Double d1 = 12D;Double d2 = 12D;System.out.println(d1 == d2);//falseLong l1 = 123L;Long l2 = 123L;System.out.println(l1 == l2);//true}
}