今天回顧了部分百度面試時被問到的問題:面試
1.常見的包裝類有哪些,他們與基本類型的區別,有哪些方法? 數組
Java語言是一個面向對象的語言,可是Java中的基本數據類型倒是不面向對象的,這在實際使用時存在不少的不便,爲了解決這個不足,在設計類時爲每一個基本數據類型設計了一個對應的類進行表明,這樣八個和基本數據類型對應的類統稱爲包裝類(Wrapper Class),有些地方也翻譯爲外覆類或數據類型類。app
基本類型 | byte | boolean | short | char | int | long | float | double |
包裝類 | Byte | Boolean | Short | Character | Integer | Long | Float | Double |
方法 | int str.parseInt() | String i.toString() | int I.intValue() | Integer(int i) | I.Valueof(String s) |
類型變換 | String → int | Integer → String | Integer → int | int→Integer | String,int→Integer |
double dou; int i = (int)dou; 實際上等價於 Double dou_obj = new Double(dou); int i = dou_obj.intValue();
2.String中的equals()和「==」有區別嗎?請解釋性能
不一樣,前者比較引用,後者比較內容。String重寫了Object類中的equals()方法,比較的是字符串的內容,而「==」只有在引用指向同一個String對象時才返回true,「==」比equals()更嚴格。ui
能夠看到String類中重寫equals()的例子以下:this
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
3.Object類有哪些方法?編碼
getClass().getName() + "@" + getHexString(HashCode());
Java中的每個對象都由一個hashCode表示,JVM維護一個哈希表(hashTable),而後由JVM經過表中的哈希碼能夠進行尋址,所以哈希碼錶明的對象也能夠用於尋找對象spa
傳統的「==」比較,是比較對象的引用是否相等,引用裏是對象的hashCode(),所以通常不等,可是咱們若是想比較兩個對象自己呢,這裏Object類提供一種對象自己是否相等的方法,在Object類自己的equals()裏它的寫法是下面這種:翻譯
public boolean equals(Object obj){
return (this == obj); }
它實際上和咱們寫的「==」比較方法是同樣的,那有人就會問equals()還有啥用啊? 實際上,我感受Java設計者爲咱們提供了一種自定義的對象的比較方法,在API中也說道Object
類的 equals 方法實現對象上差異可能性最大的相等關係:當且僅當兩個非空引用x,y引用同一個對象時,才返回true。 那麼咱們其實能夠重寫這個方法,從而比較他們的內容。設計
另外,注意到API文檔中說道,若是咱們重寫equals()方法,最好重寫hashCode()方法;由於若是根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每一個對象調用 hashCode
方法都必須生成相同的整數結果,若是根據 equals(Object) 方法,兩個對象不相等,那麼他們調用 hashCode
方法不要求不等,可是爲了哈希表性能最好不相等。所以,咱們最好重寫。
前面提到了String類重寫了equals()方法,其實String類也重寫了hashCode()方法,它是根據字符串內容生成的hashCode();
//hash是哈希碼 //count是string長度 //offset是偏移量 //value是字符串的字符數組值 public int hashCode() { int h = hash; int len = count; if (h == 0 && len > 0) { int off = offset; char val[] = value; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; }
所以有如下結論:
①兩個obj,若是equals()相等,hashCode()必定相等
②兩個obj,若是hashCode()相等,equals()不必定相等
日後還有:
4.Set、List、Map是什麼?他們的特色以及有哪些方法。
5.String、StringBuffer、StringBuilder的區別?
to be Continue...