Java基礎題

浦濤發表於2018-06-13

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()方法後本執行緒才進入物件鎖定池準備獲取物件鎖進入執行狀態。



轉載:阿木俠 芋道原始碼 




https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=2247484399&idx=1&sn=498a9f0151541d7c3bad2ebccb9aaa2f&chksm=fa497c5ecd3ef5488e6c4cddb24df96725b6147b99bbd485aa1f2c0ddb5d5604ef30026fad0d&key=de1ccb5f17d36506c921d919664438825a1235a753e24a11b1ce3a031c7b378e28090b3fdcffd4b73edbaaeb6562b6f280d4bc67a57e6cb626ac516e2eb54ccf7e5aef241c5043778c8fc78b26d0d479&ascene=0&uin=MTE1MDEyOTYwMA%3D%3D&devicetype=iMac+MacBookPro13%2C1+OSX+OSX+10.12.4+build(16E195)&version=12020810&nettype=WIFI&lang=zh_CN&fontScale=100&pass_ticket=8hfanWIrVdtZ6JsIT2zjCOessVLBtelL6wU308J%2FGjCOe3Il9eKp%2BWWn70JiqUCX


相關文章