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
比較兩個物件的引用是否相等,即 是否指向同一個物件。
總結
- 對於==,如果作用於基本資料型別,則直接比較其儲存的“值”是否相等,如果作用於引用型別的變數,則比較的是所指向的物件的地址。
- 對於 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 區別
- Integer是int的包裝類,int則是java的一種基本資料型別。
- Integer變數必須例項化後才能使用,而int變數不需要。
- Integer是物件的引用,當new一個Integer時,實際上生成一個指標指向此物件,而int則是直接儲存資料值。
- Integer預設值是null,int的預設值是0。