集合总结(Collection)
生活随笔
收集整理的這篇文章主要介紹了
集合总结(Collection)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉載自?集合總結(Collection)
最近項目上線完,閑來無事,整理了關于集合相關對比,具體詳見以下幾點: 1.ArrayList和Vector區(qū)別: 這兩個類都實現(xiàn)了List接口(List接口繼承了Collection接口),他們都是有序集合,集存儲在這兩個集合中的元素的位置都是有順序的,相當于一種動態(tài)數(shù)組,我們以后可以按位置的索引號來取出某元素,并且其中的數(shù)據(jù)是允許重復的,這是HashSet之類的集合的最大的不同之處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重復的元素。 ArrayList與Vector的區(qū)別,主要由兩個方面: ① 同步性 Vector是線程安全的,也就是說它的方法之間是線程同步的,而ArrayList是線程不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好使用ArrayList,因為它不考慮線程安全問題;如果有多個線程會訪問到集合,那最好使用Vector,因為不需要我們自己去考慮和編寫線程安全的代碼。 備注:對于Vector&ArrayList、HashTable&HashMap,要記住線程安全問題,記住Vector與HashTable是舊的,是java一誕生就提供了的,他們是線程安全的,ArrayList與HashMap是java2時才提供的,他們是線程不安全的。 ②數(shù)據(jù)增長 ArrayList與Vector都有一個初始的容量大小,當存儲進它們里面的元素的個數(shù)超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數(shù)在內存空間利用與程序效率之間要取得一定的平衡。Vector默認增長為原來的2倍,而ArrayList的增長策略在文檔中沒有明確規(guī)定(從源碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設置初始空間的大小,Vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。 總結:即Vector增長原來的一倍,ArrayList增長原來的0.5倍。 2.HashMap和HashTable區(qū)別: HashMap是HashTable的輕量級實現(xiàn)(非線程安全的實現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,在只有一個線程訪問的情況下,效率高于HashTable。 HashMap允許將null作為一個Entry的key或者Value,而HashTable不允許。 HashMap把HashTable的contains方法去掉了,改成containsvalue和congainsKey。因為contains方法容易讓人引起誤解。 HashTable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現(xiàn)。 最大的不同是,HashTable的方法是Synchronize的,而HashMap不是,在多個線程訪問HashTable時,不需要自己為它的方法實現(xiàn)同步,而HashMap必須為之提供外同步。 HashMap和HashTable采用的hash/rehash算法大致一樣,所以性能不會有很大的差異。 HashMap與HashTable主要從三個方面講: ①歷史原因:HashTable是基于陳舊的Dictionary類的,HashMap是Java1.2引進的Map接口的一個實現(xiàn); ②同步性:HashTable是線程安全的,也就是說是同步的,而HashMap是線程不安去的,不是同步的; ③值:只有HashMap可以讓你將空值作為一個表的條目的key和value。 3.List、Map、Set三個接口存取元素時,各有什么特色: 首先,List和Set具有相似性,它們都是單列元素的集合,所以它們有一個共同的父接口Collection。Set里面不允許有重復的元素,所謂重復,即不能有兩個相等(注意:不僅僅是相同)的對象。【假設Set集合中有了一個A對象,現(xiàn)在我要向Set集合再存入一個B對象,但B對象與A對象equals相等,則B對象存儲不進去,所以Set集合的add方法有一個boolean的返回值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則返回true,當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,返回結果為false。Set取元素時,沒法說取第幾個,只能以Iterator接口取得所有的元素,再逐一遍歷各個元素】 List表示有先后順序的集合,注意不是那種按年齡、大小、價格之類的排序。當我們多次盜用add(Object)方法時,每次加入的對象就想火車站買票有排隊順序一樣,按先來后到的順序排序。有時候,也可以插隊,即調用add(int index,Obj ?e)方法,就可以指定當前對象在集合中的存放位置。一個對象可以被反復存儲進List中,每調用一次add方法,這個對象就被插入進集合中一次,其實,并不是把這個對象本身存儲進集合中,而是在集合中用一個索引變量指向這個對象,當這個對象被add多次時,即相當于集合中有多個索引指向了這個對象。List除了可以以Iterator接口取得所有元素,再逐一遍歷各個元素之外,還可以調用get(index i)來明確說明取第幾個。 Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(obj key,obj value),每次存儲時,要存儲一對key/value,不能存儲重復的key,這個重復的規(guī)則也是按equals比較相等。取則可以根據(jù)key獲得相應的value,即get(Object key)返回值為key所對應的value。另外,也可以獲得所有的key的集合,還可以獲得所有的value的集合,還可以獲得key和value組合成的Map.Entry對象的集合。 List以特定次序來持有元素,可有重復元素。Set無法擁有重復元素,內部排序。Map保存key-value值,value可多值。 HashSet按照hashcode值的某種運算方式進行存儲,而不是直接按hashCode值的大小進行存儲。例如:”abc” –> 78,”def”–>62,”xyz”–>65在HashSet中的存儲順序不是62,65,78。 同一個對象可以在Vector中加入多次。往集合里面加元素,相當于集合里用一根繩子連接到目標對象。往HashSet中缺加不了多次。 4.List、Map和Set的區(qū)別: List:存儲單列數(shù)據(jù)的集合;List中存儲的數(shù)據(jù)是有順序的,并且允許重復。 Map:存儲鍵和值的雙列數(shù)據(jù)的集合;Map中存儲的數(shù)據(jù)是沒有順序的,其鍵(key)是不能重復的,它的值(value)是可以有重復 。 Set:存儲單列數(shù)據(jù)的集合;Set中存儲的數(shù)據(jù)是沒有順序的,并且不予許重復。 5.ArrayList、Vector、LinkedList的存儲性能和特性: ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度快。 LinkedList也是線程不安全的,LinkedList提供了一些方法,是的LinkedList可以被當做堆棧和隊列來使用。 6.ArrayList、HashMap容量相關: HashMap:默認容量為16,負載因子為0.75; ArrayList:默認容量為10,負載因子為0.5;總結
以上是生活随笔為你收集整理的集合总结(Collection)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称三星明年初在美国举行 Galaxy
- 下一篇: epoll 浅析以及 nio 中的 Se