Java核心技術及面試指南 集合部分總的面試題歸納以及答案


3.6.1ArrayList和LinkedList有什么差別?在哪種場景里應當用ArrayList(或LinkedList)?

大家如果學過數據結構,這個問題不難回答:前者是基於數組,數組比較擅長索引查找,但不擅長被頻繁地插入或刪除;后者是基於鏈表,它擅長被頻繁地插入或刪除,如果對其頻繁地進行索引查找,就會影響性能。

3.6.2 ArrayList和Vector有什么差別?

我們知道,ArrayList是線程不安全的,而且會以大概50%的規模進行動態擴容;而Vector是線程安全的,它會以100%的規模進行動態擴容。所以在單線程環境下,出於性能和內存使用量這兩方面的考慮,建議使用ArrayList。

3.6.3 HashSet和TreeSet有什么差別?

我們在3.2.4部分具體分析過它們的差別,這里就不再重敘。

3.6.4 我們知道,Set里不允許插入重復的元素。對於HashSet和TreeSet,如果我們要插入自定義的類,我們該往自定義的類里加入什么方法來保證“不重復”?

對於HashSet,它是基於Hash表的,我們需要重寫其中的hashCode和equals方法;對於TreeSet,我們需要重寫compareTo方法(當然還得實現Compareable接口)。具體的細節請大家閱讀3.2.3部分。

在大多數場景下,我們是會放入自定義類型,而不是簡單數據類型。如果候選人不知道怎么回答,那么我就可以認定他只是“簡單地用到了集合”,而不是“對集合有深入的了解”。

3.6.5 在使用迭代器遍歷集合對象時,我們能不能邊訪問邊修改?如果這樣做,會有什么問題?

我們在3.2.6部分里講過這個知識點。如果被問到這個問題,大家可以這樣說:第一,會報異常,因為使用迭代器時不能邊訪問邊修改;第二,這種異常其實是種保護機制,因為邊遍歷邊修改會增加出錯的機會;第三,如果確實需要這樣做,可以使用CopyOnWriteArrayList之類的集合,或者干脆別通過迭代器來訪問集合對象。

3.6.6 在使用HashMap時,你有沒有重寫hashCode和equals方法,如果不重寫,會有什么問題?如果候選人對此一臉霧水,那么我會給點提示:如果我們要在HashMap的Key部分放入自定義的類,而不是基本數據結構,那么我們該在這個自定義的類里重寫什么方法?

如果大家被問到這個問題,可以好好利用這個機會來展示你對此的深入了解。

要點1,HashMap是基於hash表這個數據結構來實現的,所以其中的get或containsKey的效率相當高(接近於1)。

要點2,描述一下Hash表的數據結構,重點說說如何通過hash算法把待存入的數據和存儲位置綁定到一起了,同時還可以說出HashMap表里是通過鏈地址法來解決沖突。

要點3,hashCode方法其實是對應hash表里的hash算法,由此我們可以計算出待存儲元素的存放位置。如果我們不重寫,將會用到Object里的hashCode方法,它是返回該對象的內存地址;而如果我們不重寫equals方法,那么在沖突的情況下,就無法定位到具體的對象了。總之,如果不重寫hashCode和equals方法,在調用containsKey和get方法時,就無法得到“看上去一致”的對象了。

如果面試官(也包括筆者)看到應試者能清晰地說出上述的意思,就認為此人對技術細節非常了解,就有可能減少集合部分(或者乃至Java Core部分)的面試題。如果大家也是這樣並在回答其它問題時不犯原則性的錯誤,那么也可能得到“對技術了解比較透徹”之類的好評。

3.6.7 Collections和Collection有什么差別?

Collections 是一個集合的一個類,其中包含有一些和集合操作相關的靜態多態方法。Jave集合里則有另外一個和它非常相似的接口Collection(不帶s),它是線性表類集合的父接口,List和Set等接口都是通過實現這個接口來實現的。

3.6.8 如果我們要給自定義的類排序,可以怎么做?

大家可以閱讀3.4.1部分,我們可以通過重寫Collections.sort的方法來實現。

在3.4部分,我們詳細講了如何通過Collection的方法實現排序和線程安全。請大家找機會,向面試官說出你用過這些方法;因為一旦證明你用過,面試官就會感覺你對集合部分用得比較深入。

3.6.9你有沒有用過T,?, super和extends這種泛型?

說實在的,上述泛型在實際的項目里用得還真不多,你如果說沒用過,面試官也不會難為你。不過大家可以結合3.5.1部分的知識點,向面試官說明你是怎么把泛型作用到類和方法上,也可以結合3.5.2里描述的copy方法向面試官說明? extends和? super的用法,如此面試官就會認為你對集合部分的知識掌握得很透徹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM