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。
大體回答如上,類似文章請移駕:
HashMap和ConcurrentHashMap的區別
1、HashMap不是執行緒安全的,而ConcurrentHashMap是執行緒安全的。
2、ConcurrentHashMap採用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的陣列分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那麼在插入元素的時候就需要先找到應該插入到哪一個片段segment,然後再在這個片段上面進行插入,而且這裡還需要獲取segment鎖。
3、ConcurrentHashMap讓鎖的粒度更精細一些,併發效能更好。
大體回答如上,類似文章請移駕:
至於兩者的底層實現,你如果想透過一篇文章就理解了,那就too young了,好好找些博文+看原始碼去吧。
HashTable和ConcurrentHashMap的區別
它們都可以用於多執行緒的環境,但是當Hashtable的大小增加到一定的時候,效能會急劇下降,因為迭代時需要被鎖定很長的時間。因為ConcurrentHashMap引入了分割(segmentation),不論它變得多麼大,僅僅需要鎖定map的某個部分,而其它的執行緒不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。
大體回答如上,類似文章請移駕:
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()方法後本執行緒才進入物件鎖定池準備獲取物件鎖進入執行狀態。