Java中高階面試題(1)

2021-08-19 07:50:29 字數 2725 閱讀 3901

list和set比較,各自的子模擬較

對比一:arraylist與linkedlist的比較

1、arraylist是實現了基於動態陣列的資料結構,因為位址連續,一旦資料儲存好了,查詢操作效率會比較高(在記憶體裡是連著放的)。

2、因為位址連續, arraylist要移動資料,所以插入和刪除操作效率比較低。   

3、linkedlist基於鍊錶的資料結構,位址是任意的,所以在開闢記憶體空間的時候不需要等乙個連續的位址,對於新增和刪除操作add和remove,linedlist比較佔優勢。

4、因為linkedlist要移動指標,所以查詢操作效能比較低。

適用場景分析:

當需要對資料進行對此訪問的情況下選用arraylist,當需要對資料進行多次增加刪除修改時採用linkedlist。

對比二:arraylist與vector的比較

1、vector的方法都是同步的,是執行緒安全的,而arraylist的方法不是,由於執行緒的同步必然要影響效能。因此,arraylist的效能比vector好。 

2、當vector或arraylist中的元素超過它的初始大小時,vector會將它的容量翻倍,而arraylist只增加50%的大小,這樣。arraylist就有利於節約記憶體空間。

3、大多數情況不使用vector,因為效能不好,但是它支援執行緒的同步,即某一時刻只有乙個執行緒能夠寫vector,避免多執行緒同時寫而引起的不一致性。

4、vector可以設定增長因子,而arraylist不可以。

適用場景分析:

1、vector是執行緒同步的,所以它也是執行緒安全的,而arraylist是執行緒非同步的,是不安全的。如果不考慮到執行緒的安全因素,一般用arraylist效率比較高。

2、如果集合中的元素的數目大於目前集合陣列的長度時,在集合中使用資料量比較大的資料,用vector有一定的優勢。

對比三:hashset與treeset的比較

1.treeset 是二叉樹實現的,treeset中的資料是自動排好序的,不允許放入null值 。

2.hashset 是雜湊表實現的,hashset中的資料是無序的,可以放入null,但只能放入乙個null,兩者中的值都不能重複,就如資料庫中唯一約束 。

3.hashset要求放入的物件必須實現hashcode()方法,放入的物件,是以hashcode碼作為標識的,而具有相同內容的string物件,hashcode是一樣,所以放入的內容不能重複。但是同乙個類的物件可以放入不同的例項。

適用場景分析:

hashset是基於hash演算法實現的,其效能通常都優於treeset。我們通常都應該使用hashset,在我們需要排序的功能時,我們才使用treeset。

大體回答如上,類似文章請移駕:

list,set和map詳解及其區別和他們分別適用的場景

hashmap和concurrenthashmap的區別

1、hashmap不是執行緒安全的,而concurrenthashmap是執行緒安全的。

2、concurrenthashmap採用鎖分段技術,將整個hash桶進行了分段segment,也就是將這個大的陣列分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那麼在插入元素的時候就需要先找到應該插入到哪乙個片段segment,然後再在這個片段上面進行插入,而且這裡還需要獲取segment鎖。

3、concurrenthashmap讓鎖的粒度更精細一些,併發效能更好。

大體回答如上,類似文章請移駕:

hashmap詳解

至於兩者的底層實現,你如果想通過一篇文章就理解了,那就too young了,好好找些博文+看原始碼去吧。

hashtable和concurrenthashmap的區別

它們都可以用於多執行緒的環境,但是當hashtable的大小增加到一定的時候,效能會急劇下降,因為迭代時需要被鎖定很長的時間。因為concurrenthashmap引入了分割(segmentation),不論它變得多麼大,僅僅需要鎖定map的某個部分,而其它的執行緒不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,concurrenthashmap僅僅鎖定map的某個部分,而hashtable則會鎖定整個map。

大體回答如上,類似文章請移駕:

hashmap和hashtable到底哪不同?

string,stringbuffer和stringbuilder的區別

1、執行速度,或者說是執行速度,在這方面執行速度快慢為:stringbuilder > stringbuffer > string。

2、執行緒安全上,stringbuilder是執行緒不安全的,而stringbuffer是執行緒安全的。

適用場景分析:

string:適用於少量的字串操作的情況

stringbuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況

stringbuffer:適用多執行緒下在字元緩衝區進行大量操作的情況

大體回答如上,類似文章請移駕:

string、stringbuffer與stringbuilder介紹

wait和sleep的區別

1、sleep()方法是屬於thread類中的,而wait()方法,則是屬於object類中的。

2、sleep()方法導致了程式暫停執行指定的時間,讓出cpu給其他執行緒,但是他的監控狀態依然保持著,當指定的時間到了又會自動恢復執行狀態。所以在呼叫sleep()方法的過程中,執行緒不會釋放物件鎖。

3、呼叫wait()方法的時候,執行緒會放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫notify()方法後本執行緒才進入物件鎖定池準備獲取物件鎖進入執行狀態。

java中高階面試

同步互動 指傳送乙個請求,需要等待返回,然後才能夠傳送下乙個請求,有個等待過程 非同步互動 指傳送乙個請求,不需要等待返回,隨時可以再傳送下乙個請求,即不需要等待。區別 乙個需要等待,乙個不需要等待,在部分情況下,我們的專案開發中都會優先選擇不需要等待的非同步互動方式。哪些情況建議使用同步互動呢?比...

Java中高階面試題及答案解析(5)

什麼是執行緒死鎖?死鎖如何產生?如何避免執行緒死鎖?死鎖的介紹 執行緒死鎖是指由於兩個或者多個執行緒互相持有對方所需要的資源,導致這些執行緒處於等待狀態,無法前往執行。當執行緒進入物件的synchronized 塊時,便占有了資源,直到它退出該 塊或者呼叫wait方法,才釋放資源,在此期間,其他執行...

java高階面試題三

一 springmvc的工作原理 1 使用者傳送請求給 控制器 2 控制器指派處理器對映 3 根據handlemaooing查詢處理器 4 獲取到處理器位址 5 控制器返回處理器位址 6 控制器指派處理器介面卡 帶著處理器對映器返回的位址 7 處理器介面卡根據命令對c進行處理 8 c向m發出請求 9...