引用類型:== 是直接比較的兩個對象的堆內存地址,若是相等,則說明兩個引用實際是指向同一個對象地址的。java
基本類型:對於 基本數據類型(8個)和 String 來講又是怎樣呢?算法
int a = 123;
int b = 123;
System.out.println(a == b); // true
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true
String s3 = new String("abc");
System.out.println(s1 == s3); // false
複製代碼
對於基本類型(8個)和 直接聲明的 "abc" 字符串,他們是做爲字面量存在常量池中以 HashSet 策略存儲起來的,在常量池中,一個常量只會對應一個地址,因此它們的引用都是指向的同一塊地址。數組
另外,對於基本數據的包裝類型,除了Float和Double以外,其餘的六種都是實現了常量池技術,其中 Integer 在常量池中的存儲範圍爲 [-128,127] ,在這個範圍外的值,會在堆內存中建立一個新的對象保存這個值。markdown
Object 的通用方法,在沒有重寫以前,與 == 是沒有區別的;ide
public boolean equals(Object obj) {
return (this == obj);
}
複製代碼
而通常 equals 方法是須要咱們自行重寫的,String 和 基本類型封裝類就重寫了 equals,從而進行的是內容的比較;this
通常實現:spa
public class Student {
private String num;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(num, student.num) &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(num, name);
}
}
複製代碼
檢查是否爲同一個對象的引用,若是是直接返回 true;code
檢查是否爲空,是否同一類型,爲空 或 類型不一致,返回 false;orm
將 Object 對象轉型;對象
判斷每一個屬性的值是否相等