阿里巴巴面試題,看看你能回答出多少?

面試 程序員 Java 編程語言 碼農那些事 碼農那些事 2017-09-02

阿里巴巴面試題,看看你能回答出多少?

本頭條號會不定期分享程序員的面試經驗,以及程序員需要掌握的技術乾貨,喜歡就關注我吧~所有發佈的文章,我會盡量原創,每個字都是手打出來。

前幾天分享了一個唯品會的面試經驗,今天分享下阿里巴巴的Java面試經驗。為了幫助大家更好的掌握知識,每一個題目我都會進行詳細的解答說明。關於自我介紹和自己的項目介紹這塊就跳過了,直接進入技術題問答。

1.Object類的hashCode和equals方法的作用是什麼,子類重寫時需要注意什麼?

一開始聽到這個問題時,我是有點懵的,不太理解到底想問什麼。hashCode方法作用是返回一個哈希值,equals方法則是用於比較是否相等。關於子類重寫時需要注意什麼,我只想到了hashCode由於是哈希值嘛,肯定需要儘可能的保證分佈均勻,由於是第一個問題,一下子也沒進入狀態,說來說去只能說出要儘可能均勻。

這個問題的答案其實在Effective Java中有詳細說明,裡面專門有條目來講相關的問題。總結一下就是:

1.覆蓋equals方法時需要遵循通用約定:自反性、對稱性、傳遞性、一致性.

2.覆蓋equals方法時總要覆蓋hashCode方法.

3.如果兩個對象是equlals的,那麼它們的hashCode值必須相等(否則put到Map中可能get不到).

4.一個好的hashCode方法通常傾向於“為不相等的對象產生不同的hashCode值”。

由此可見,我說要儘可能使得hash值分佈均勻,其實只是勉強答了第四個小點。

2.HashMap是否線程安全,線程安全的定義,想要線程安全時怎麼辦,ConcurrentHashMap實現原理

HashMap顯然不是線程安全的。關於線程安全的定義,我在面試時多次被問到這個問題。看過Java併發編程那本經典書籍的人應該會有點印象,書上也說線程安全沒有非常明確的定義,書上給了一種定義。

當多個線程訪問某個類時,不管運行時環境採用何種調度方式或者這些線程將如何交替執行,並且在主調代碼中不需要任何額外的同步或協調,這個類都能表現出正確的行為,那麼就稱這個類是線程安全的。[Java併發編程實戰]。

在線程安全的定義中,最核心的概念就是正確性。在線程安全類中封裝了必要的同步機制,因此客戶端無需進一步採取同步措施。

額外提一句,我這邊是把多個小問題都列在了一起;實際上面試時,面試官會根據你的回答而進一步深入問。如果你回答HashMap是線程安全的,那很可能面試官就不問你怎麼樣叫線程安全了,因為你最基礎的就回答錯誤了。當你回答出線程安全版本ConcurrentHashMap時,就會進一步問你ConcurrentHashMap的實現原理,層層遞進。

需要注意的一點是,當你回答ConcurrentHashMap實現原理時,如果你想拿到更高的評價,那至少也要分別說下JDK 1.7中和JDK 1.8中ConcurrentHashMap各自的實現,兩個不同版本的實現區別有哪些,為什麼要這麼做。如果你不管三七二十一,上來就說ConcurrentHashMap內部是由多個Segment段組成(默認16個),巴拉巴拉....那就很平庸了。

3.快排和冒泡算法排序比較哪個快?描述下快排的過程?

感覺這個像是個小陷阱,不過陷阱設置得也不明顯,一般學過數據結構的人就不至於答錯,除非真的工作太久記不清了。答案是和輸入有關,比較需問清楚比的是什麼,是比較最壞時間複雜度還是平均時間複雜度。

關於快排的過程,如果工作太久了,一下子可能還真說不清楚了。面試時,只隱約記得算法導論還是哪本書上提到快排分two way和three way,還有各種變種,比如取pivot(基準)時就可以是取第一個元素,多個元素取中值,多箇中取隨機一個等等。

4.有一個類有一個成員變量和一個方法,當創建100個該類對象時,內存裡有多少個成員變量和多少個方法?

這個問題是我這次面試中,感覺最靈活的一個問題了,非常考察技術水平。

首先,方法不在對象中,不管這個類有多少個對象,方法都是共用的,只有1個。

其次,容易想到的一點就是,成員個數和是否static有關,如果是static的,那就是類級別的變量,即使有100個對象也都是共用的,也只有一個成員變量了。

然後,面試官就問,還有沒有別的可能了,直覺告訴我,肯定還有我沒想到的點,但是想來想去,似乎也就是這兩點了。我就問面試官,能否給點提示。

注意,面試時,如果真的回答不了,可以讓面試官給你點提示,既表明你在認真思考,也表現出你的溝通能力。

面試官問我瞭解ClassLoader嗎?怎麼判斷兩個對象是不是屬於同一個類?然後我就回答了這個問題,但是我還是沒反應過來這和剛才的問題有什麼聯繫,面試官再三提示,我才明白過來,如果成員是static,但是當由不同ClassLoader加載則仍然會不止一個成員變量。

5.然後順著ClassLoader,面試官繼續問雙親委託加載原理,為什麼要雙親委託加載,如何打破雙親委託加載?Tomcat中的ClassLoader怎麼做的?

ClassLoader類是個抽象類,這邊著重提一下它的幾個關鍵方法:

loadClass:實現了雙親委託加載的過程,如果所有父類都無法加載,則由自己調用findClass進行加載;

findClass:默認實現是拋出ClassNotFoundException,需由子類去實現怎麼找到指定類,讀取class文件到byte流的過程,然後通過調用defineClass來返回Class對象;

defineClass:將byte字節流解析成JVM能識別的Class對象;

Tomcat中的ClassLoader有分多個層次,如CommonClassLoader、WebAppClassLoader,這個不同版本還有點不同,細節就不展開了。

今天的內容有點深入,畢竟是阿里的面試題,難度還是不小的,而且這個只是一面的面試題。分享阿里的面試經驗,並非一定是要進阿里不可,也是一個學習的過程。大家如果對自己的技術能力有信心,可以投下阿里的崗位,看看自己掌握的是否紮實。

本頭條號會不定期分享程序員的面試經驗,以及程序員需要掌握的技術乾貨,喜歡就關注我吧~

完。

相關推薦

推薦中...