您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中有哪些高級面試題”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中有哪些高級面試題”吧!
List和Set比較,各自的子類比較
對比一:Arraylist與LinkedList的比較
1、ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構,因為地址連續(xù),一旦數(shù)據(jù)存儲好了,查詢操作效率會比較高(在內(nèi)存里是連著放的)。
2、因為地址連續(xù), ArrayList要移動數(shù)據(jù),所以插入和刪除操作效率比較低。
3、LinkedList基于鏈表的數(shù)據(jù)結(jié)構,地址是任意的,所以在開辟內(nèi)存空間的時候不需要等一個連續(xù)的地址,對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢。
4、因為LinkedList要移動指針,所以查詢操作性能比較低。
適用場景分析:
當需要對數(shù)據(jù)進行對此訪問的情況下選用ArrayList,當需要對數(shù)據(jù)進行多次增加刪除修改時采用LinkedList。
對比二:ArrayList與Vector的比較
1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能。因此,ArrayList的性能比Vector好。
2、當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣。ArrayList就有利于節(jié)約內(nèi)存空間。
3、大多數(shù)情況不使用Vector,因為性能不好,但是它支持線程的同步,即某一時刻只有一個線程能夠?qū)慥ector,避免多線程同時寫而引起的不一致性。
4、Vector可以設置增長因子,而ArrayList不可以。
適用場景分析:
1、Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。
2、如果集合中的元素的數(shù)目大于目前集合數(shù)組的長度時,在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù),用Vector有一定的優(yōu)勢。
對比三:HashSet與TreeSet的比較
1.TreeSet 是二叉樹實現(xiàn)的,Treeset中的數(shù)據(jù)是自動排好序的,不允許放入null值 。
2.HashSet 是哈希表實現(xiàn)的,HashSet中的數(shù)據(jù)是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數(shù)據(jù)庫中唯一約束 。
3.HashSet要求放入的對象必須實現(xiàn)HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內(nèi)容的String對象,hashcode是一樣,所以放入的內(nèi)容不能重復。但是同一個類的對象可以放入不同的實例。
適用場景分析:
HashSet是基于Hash算法實現(xiàn)的,其性能通常都優(yōu)于TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。
大體回答如上,類似文章請移駕:
List,Set和Map詳解及其區(qū)別和他們分別適用的場景
HashMap和ConcurrentHashMap的區(qū)別
1、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。
2、ConcurrentHashMap采用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的數(shù)組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那么在插入元素的時候就需要先找到應該插入到哪一個片段segment,然后再在這個片段上面進行插入,而且這里還需要獲取segment鎖。
3、ConcurrentHashMap讓鎖的粒度更精細一些,并發(fā)性能更好。
大體回答如上,類似文章請移駕:
HashMap詳解
至于兩者的底層實現(xiàn),你如果想通過一篇文章就理解了,那就too young了,好好找些博文+看源碼去吧。
HashTable和ConcurrentHashMap的區(qū)別
它們都可以用于多線程的環(huán)境,但是當Hashtable的大小增加到一定的時候,性能會急劇下降,因為迭代時需要被鎖定很長的時間。因為ConcurrentHashMap引入了分割(segmentation),不論它變得多么大,僅僅需要鎖定map的某個部分,而其它的線程不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。
大體回答如上,類似文章請移駕:
HashMap和HashTable到底哪不同?
String,StringBuffer和StringBuilder的區(qū)別
1、運行速度,或者說是執(zhí)行速度,在這方面運行速度快慢為:StringBuilder > StringBuffer > String。
2、線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。
適用場景分析:
String:適用于少量的字符串操作的情況
StringBuilder:適用于單線程下在字符緩沖區(qū)進行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區(qū)進行大量操作的情況
大體回答如上,類似文章請移駕:
String、StringBuffer與StringBuilder介紹
wait和sleep的區(qū)別
1、sleep()方法是屬于Thread類中的,而wait()方法,則是屬于Object類中的。
2、sleep()方法導致了程序暫停執(zhí)行指定的時間,讓出cpu給其他線程,但是他的監(jiān)控狀態(tài)依然保持著,當指定的時間到了又會自動恢復運行狀態(tài)。所以在調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。
3、調(diào)用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify()方法后本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態(tài)。
感謝各位的閱讀,以上就是“Java中有哪些高級面試題”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java中有哪些高級面試題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。