十个经典Java 集合面试题!
點(diǎn)擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號
重磅資訊、干貨,第一時間送達(dá) 今日推薦:終于放棄了單調(diào)的swagger-ui了,選擇了這款神器—knife4j個人原創(chuàng)+1博客:點(diǎn)擊前往,查看更多這里有10個經(jīng)典的Java面試題,也為大家列出了答案。這是Java開發(fā)人員面試經(jīng)常容易遇到的問題,相信你了解和掌握之后一定會有所提高。
讓我們一起來看看吧。
1.Java的HashMap是如何工作的?
HashMap是一個針對數(shù)據(jù)結(jié)構(gòu)的鍵值,每個鍵都會有相應(yīng)的值,關(guān)鍵是識別這樣的值。
HashMap 基于 hashing 原理,我們通過 put ()和 get ()方法儲存和獲取對象。當(dāng)我們將鍵值對傳遞給 put ()方法時,它調(diào)用鍵對象的 hashCode ()方法來計(jì)算 hashcode,讓后找到 bucket 位置來儲存值對象。
當(dāng)獲取對象時,通過鍵對象的 equals ()方法找到正確的鍵值對,然后返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當(dāng)發(fā)生碰撞了,對象將會儲存在 LinkedList 的下一個節(jié)點(diǎn)中。HashMap 在每個 LinkedList 節(jié)點(diǎn)中儲存鍵值對對象。
附上我歷時三個月總結(jié)的?Java面試思維導(dǎo)圖,拿去不謝!
下載方式
1.?首先掃描下方二維碼
2.?后臺回復(fù)「思維導(dǎo)圖」即可獲取
2.什么是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發(fā)ConcurrentModifcationException在底層集合迭代過程中被修改。故障安全作為發(fā)生在實(shí)例中的一個副本迭代是不會拋出任何異常的。
快速失敗的故障安全范例定義了當(dāng)遭遇故障時系統(tǒng)是如何反應(yīng)的。例如,用于失敗的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。
3.Java BlockingQueue是什么?
Java BlockingQueue是一個并發(fā)集合util包的一部分。BlockingQueue隊(duì)列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
4.什么時候使用ConcurrentHashMap?
在問題2中我們看到ConcurrentHashMap被作為故障安全迭代器的一個實(shí)例,它允許完整的并發(fā)檢索和更新。當(dāng)有大量的并發(fā)更新時,ConcurrentHashMap此時可以被使用。
這非常類似于Hashtable,但ConcurrentHashMap不鎖定整個表來提供并發(fā),所以從這點(diǎn)上ConcurrentHashMap的性能似乎更好一些。所以當(dāng)有大量更新時ConcurrentHashMap應(yīng)該被使用。
5.哪一個List實(shí)現(xiàn)了最快插入?
LinkedList和ArrayList是另個不同變量列表的實(shí)現(xiàn)。ArrayList的優(yōu)勢在于動態(tài)的增長數(shù)組,非常適合初始時總長度未知的情況下使用。LinkedList的優(yōu)勢在于在中間位置插入和刪除操作,速度是最快的。
LinkedList實(shí)現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊(duì)列(queue)或雙向隊(duì)列(deque)。
ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。每個ArrayList實(shí)例都有一個容量(Capacity),即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。當(dāng)需要插入大量元素時,在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
6.Iterator和ListIterator的區(qū)別
●ListIterator有add()方法,可以向List中添加對象,而Iterator不能。
●ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。
●ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實(shí)現(xiàn)。Iterator沒有此功能。
●都可實(shí)現(xiàn)刪除對象,但是ListIterator可以實(shí)現(xiàn)對象的修改,set()方法可以實(shí)現(xiàn)。Iierator僅能遍歷,不能修改。
7.什么是CopyOnWriteArrayList,它與ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中所有可變操作(add、set等等)都是通過對底層數(shù)組進(jìn)行一次新的復(fù)制來實(shí)現(xiàn)的。相比較于ArrayList它的寫操作要慢一些,因?yàn)樗枰獙?shí)例的快照。
CopyOnWriteArrayList中寫操作需要大面積復(fù)制數(shù)組,所以性能肯定很差,但是讀操作因?yàn)椴僮鞯膶ο蠛蛯懖僮鞑皇峭粋€對象,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完后通過一個簡單的'='將引用指向新的數(shù)組對象上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多線程里使用,絕對不會發(fā)生ConcurrentModificationException ,因此CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場景里,比如緩存。
8.迭代器和枚舉之間的區(qū)別
如果面試官問這個問題,那么他的意圖一定是讓你區(qū)分Iterator不同于Enumeration的兩個方面:
●Iterator允許移除從底層集合的元素。
●Iterator的方法名是標(biāo)準(zhǔn)化的。
9.Hashmap如何同步?
當(dāng)我們需要一個同步的HashMap時,有兩種選擇:
●使用Collections.synchronizedMap(..)來同步HashMap。
●使用ConcurrentHashMap的
這兩個選項(xiàng)之間的首選是使用ConcurrentHashMap,這是因?yàn)槲覀儾恍枰i定整個對象,以及通過ConcurrentHashMap分區(qū)地圖來獲得鎖。
10.IdentityHashMap和HashMap的區(qū)別
IdentityHashMap是Map接口的實(shí)現(xiàn)。不同于HashMap的,這里采用參考平等。
●在HashMap中如果兩個元素是相等的,則key1.equals(key2)
●在IdentityHashMap中如果兩個元素是相等的,則key1 == key2
來自:evget.com/article/2014/11/27/21869.html
最后,再附上我歷時三個月總結(jié)的?Java 面試 + Java 后端技術(shù)學(xué)習(xí)指南,這是本人這幾年及春招的總結(jié),目前,已經(jīng)拿到了大廠offer,拿去不謝!
下載方式
1.?首先掃描下方二維碼
2.?后臺回復(fù)「Java面試」即可獲取
總結(jié)
以上是生活随笔為你收集整理的十个经典Java 集合面试题!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 应用性能调优,可视化工具
- 下一篇: Java 多线程启动为什么调用 star