Java基礎- ==和equals和hashCode的區別

Merbng發表於2018-05-19

java中==和equals和hashCode的區別

1. ==

在用關係操作符 == 比較的是值本身,

        int n=3;
        int m=3;
        
        System.out.println(n==m);
        
        String str = new String("hello");
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        System.out.println(str1==str2);
        
        str1 = str;
        str2 = str;
        System.out.println(str1==str2);

複製程式碼

結果是:true,false,true

物件型別的比較,比較的是地址(引用),而非值本身,也是就是說他們實際儲存的記憶體地址不同。

2. equals

比較兩個物件的引用是否相等,即 是否指向同一個物件。

總結

  1. 對於==,如果作用於基本資料型別,則直接比較其儲存的“值”是否相等,如果作用於引用型別的變數,則比較的是所指向的物件的地址。
  2. 對於 equals 方法,注意:equals不能作用於基本資料型別,如果沒有對equals進行重寫,則比較的是 引用類所指向的地址。如果重寫了,比較的就是物件的內容。

3. hashCode

用來鑑定兩個物件是否相等,Object類中的hashCode方法返回物件在記憶體中地址轉換成的一個int值,所以如果沒有重寫hashCode方法,任何物件的hashCode方法是不相等的。

設計hashCode()時最重要的因素就是:無論何時,對同一個物件呼叫hashCode都應該產生同一個值。

如果重寫了equals方法就必須要重寫hashCode方法,以便使用者將物件插入到雜湊表中。

equals相等的兩個物件,hashCode一定相等,equals不相等的兩個物件,卻並不能證明他們的hashCode不相等。

equals方法不相等的兩個物件,hashCode有可能相等,

在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法,如果不這樣做的話,就會違反Object.hashCode的通用約定。從而導致該類無法結合所有基於雜湊的集合一起正常運作。

int、char、long 各佔多少位元組數

  • byte 是 位元組

  • bit 是 位

1 byte = 8 bit

  • char在java中是2個位元組,java採用unicode,2個位元組來表示一個字元
  • short 2個位元組
  • int 4個位元組
  • long 8個位元組
  • float 4個位元組
  • double 8個位元組

int 與 integer 區別

  1. Integer是int的包裝類,int則是java的一種基本資料型別。
  2. Integer變數必須例項化後才能使用,而int變數不需要。
  3. Integer是物件的引用,當new一個Integer時,實際上生成一個指標指向此物件,而int則是直接儲存資料值。
  4. Integer預設值是null,int的預設值是0。

相關文章