【Java學習筆記】百度面試問題回顧(一)

今天回顧了部分百度面試時被問到的問題:面試

1.常見的包裝類有哪些,他們與基本類型的區別,有哪些方法?   數組

  Java語言是一個面向對象的語言,可是Java中的基本數據類型倒是不面向對象的,這在實際使用時存在不少的不便,爲了解決這個不足,在設計類時爲每一個基本數據類型設計了一個對應的類進行表明,這樣八個和基本數據類型對應的類統稱爲包裝類(Wrapper Class),有些地方也翻譯爲外覆類或數據類型類。app


基本類型 byte boolean short char int long float double
包裝類 Byte Boolean Short Character Integer Long Float Double
八種基本的數據類型都有相應的包裝類。
區別:基本類型不面向對象,存在於棧,包裝類是面向對象的,有對象操做,有相應的方法供使用,例如字符串轉整型等。
包裝類的主要做用:包裝類方便對象操做,包含每種類型的最大值最小值MaxValue,MinValue
例如 Integer中一些很方便的類型轉換方法
 方法  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類有哪些方法?編碼

  • toString(): 返回對象的 類名@哈希碼 。通常建議重載。
getClass().getName() + "@" + getHexString(HashCode());
  • hashCode(): 返回對象的 哈希編碼 。  

  Java中的每個對象都由一個hashCode表示,JVM維護一個哈希表(hashTable),而後由JVM經過表中的哈希碼能夠進行尋址,所以哈希碼錶明的對象也能夠用於尋找對象spa

  • equals(): 比較對象是否相等。      

  傳統的「==」比較,是比較對象的引用是否相等,引用裏是對象的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...

相關文章
相關標籤/搜索