Java系列-Set、List、Map的周遊總結
标簽: Java集合周遊arraylisthashmapiterator 2015-04-28 08:21 1996人閱讀 評論(2) 收藏 舉報

分類: Java(19)
作者同類文章 X
版權聲明:本文為部落客原創文章,轉載請注明來源。
不知道為什麼,昨天寫的這篇文章不見了。早上重新補上來吧,以後寫東西還是得先寫在電腦裡面,然後在釋出出來才行。
集合類一直讓我感覺頭痛,因為我老是搞混淆,可能是基礎不夠紮實的原因吧。現在專們花個時間來總結下,以後混淆了就直接來檢視便是。那麼,就先來看看各種集合類的比較表吧。
先寫下我自己的記憶方式:
Collection:把它當做是一個集合,沒有任何限制條件的集合,那麼它裡面的元素是可以重複的,并且也是雜亂無序的;
Set:其實它也是一個集合,不過它在Collection上加了一個限制條件就是元素不可以重複;
List:可以把它看成是一個實實在在的數組,對于數組而言,是有序的而且元素也是可以重複的;
Map:其實是鍵值對存儲,那麼跟連結清單差不多,如果是HashMap的話,節點的存儲随機的,也就是無序,鍵當然是唯一的,是以HashMap是無序且key不可重複的,而對于TreeMap來說的話,它就相當于一棵樹,那麼它是有序的,當然,key也是不可重複的;
總而言之:隻要帶Hash的都是無序的,隻要是當做實實在在的數組存儲的都是有序的,而像Collection和Set之類的作為集合操作的,都是無序的,允不允許重複還得看誰是最原始的不加任何限制的,即Collection可重複,Set不可重複。
集合類比較表
是否有序 | 是否允許元素重複 | ||
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | |||
TreeSet | 是(用二叉樹排序) | ||
Map | AbstractMap | 否 | 使用key-value來映射和存儲資料,Key必須惟一,value可以重複 |
HashMap | |||
TreeMap | 是(用二叉樹排序) |
常用的集合類介紹
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Set(集):(HashSet)無序不重複
List(ArrayList和LinkedList)(清單):無序可重複
Map(映射,鍵值對):(HashMap)有序key值不重複
Collection:父接口
Set:接口---實作類: HashSet、LinkedHashSet
List:接口---實作類:LinkedList,Vector,ArrayList
SortedSet:接口---實作類:TreeSet
1.List總結
(1)所有的List中隻能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];
(2) 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
(3) 所有的List中可以有null元素,例如[ tom,null,1 ];
(4) 基于Array的List(Vector,ArrayList)适合查詢,而LinkedList(連結清單)适合添加,删除操作。
List:有序清單,允許存放重複的元素;
實作類:
(1)ArrayList:數組實作,查詢快,增删慢,線程不安全,輕量級;
(2)LinkedList:連結清單實作,增删快,查詢慢;
(3)Vector:數組實作,線程安全,重量級 。
例:levit應用中使用集合分布表:
集合類型 | 應用數量 |
ArrayList | 184處 |
LinkedList | 2處 |
Vector |
分析:從以上的分析結果來看ArrayList是用的最多的,Vector沒有用到(有性能問題,不建議使用)。
Vector和ArrayList的差別
(1)同步性:Vector是同步的。這個類中的一些方法保證了Vector中的對象是線程安全的。而ArrayList則是異步的,是以ArrayList中的對象并不是線程安全的。因為同步的要求會影響執行的效率,是以如果不需要線程安全的集合那麼使用ArrayList是一個很好的選擇,這樣可以避免由于同步帶來的不必要的性能開銷。
(2)資料增長:從内部實作機制來講ArrayList和Vector都是使用數組(Array)來控制集合中的對象。當你向這兩種類型中增加元素的時候,如果元素的數目超出了内部數組目前的長度它們都需要擴充内部數組的長度,Vector預設情況下自動增長原來一倍的數組長度,ArrayList是原來的50%,是以最後你獲得的這個集合所占的空間總是比你實際需要的要大。是以如果你要在集合中儲存大量的資料那麼使用Vector有一些優勢,因為你可以通過設定集合的初始化大小來避免不必要的資源開銷。
List周遊的三種方法
ArrayList
[java] view plain copy print ?
- public static void testArrayList(){
- //ArrayList 有序允許重複
- List<String> list = new ArrayList<String>();
- list.add("我是小顔");
- list.add("我是小顔");
- list.add("我是幕燃");
- list.add("我是幕燃2");
- //周遊第一種 get
- for (int i = 0; i < list.size(); i++) {
- System.out.println(list.get(i));
- }
- //周遊第二種 Iterator
- Iterator<String> it = list.iterator();
- while(it.hasNext()){
- String str = (String)it.next();
- System.out.println(str);
- }
- //周遊第三種 for
- for (String str : list) {
- System.out.println(str);
- }
- }
public static void testArrayList(){
//ArrayList 有序允許重複
List<String> list = new ArrayList<String>();
list.add("我是小顔");
list.add("我是小顔");
list.add("我是幕燃");
list.add("我是幕燃2");
//周遊第一種 get
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//周遊第二種 Iterator
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
//周遊第三種 for
for (String str : list) {
System.out.println(str);
}
}
LinkedList
[java] view plain copy print ?
- public static void testLinkedList(){
- //有序可重複
- List<String> list = new LinkedList<String>();
- list.add("我是哈哈");
- list.add("我是哈哈");
- list.add("我是幕燃");
- list.add("我是幕燃2");
- //周遊第一種 get
- for (int i = 0; i < list.size(); i++) {
- System.out.println(list.get(i));
- }
- //周遊第二種 Iterator
- Iterator<String> it = list.iterator();
- while(it.hasNext()){
- String str = (String)it.next();
- System.out.println(str);
- }
- //周遊第三種 for
- for (String str : list) {
- System.out.println(str);
- }
- }
public static void testLinkedList(){
//有序可重複
List<String> list = new LinkedList<String>();
list.add("我是哈哈");
list.add("我是哈哈");
list.add("我是幕燃");
list.add("我是幕燃2");
//周遊第一種 get
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//周遊第二種 Iterator
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
//周遊第三種 for
for (String str : list) {
System.out.println(str);
}
}
2.Set總結
(1)Set實作的基礎是Map(HashMap);
(2) 無序集合,Set中的元素是不能重複的,如果使用add(Object obj)方法添加已經存在的對象,則會覆寫前面的對象,允許使用null元素;
(3)HashSet 的背景有一個HashMap;初始化背景容量;隻不過生成一個HashSet的話,系統隻提供key的通路;如果有兩個Key重複,那麼會覆寫之前的;
實作類HashSet:equals傳回true,hashCode傳回相同的整數;哈希表;存儲的資料是無序的。
實作類LinkedHashSet:此實作與HashSet的不同之外在于,後者維護着一個運作于所有條目的雙重連結清單。存儲的資料是有序的。
子接口SortedSet,對Set排序實作類 :TreeSet:使用元素的自然順序對元素進行排序,或者根據建立 set 時提供的 Comparator 進行排序;二叉樹實作的;
Set周遊的兩種方式:
[java] view plain copy print ?
- public static void testSet(){
- //無序不重複
- Set<String> set = new HashSet<String>();
- set.add("我是哈哈");
- set.add("我是哈哈");
- set.add("我是幕燃");
- set.add("我是幕燃2");
- //周遊方法一 Iterator
- Iterator<String> it = set.iterator();
- while(it.hasNext()){
- String str = it.next().toString();
- System.out.println(str);
- }
- //周遊方法二 for
- for (String str: set) {
- System.out.println(str);
- }
- }
public static void testSet(){
//無序不重複
Set<String> set = new HashSet<String>();
set.add("我是哈哈");
set.add("我是哈哈");
set.add("我是幕燃");
set.add("我是幕燃2");
//周遊方法一 Iterator
Iterator<String> it = set.iterator();
while(it.hasNext()){
String str = it.next().toString();
System.out.println(str);
}
//周遊方法二 for
for (String str: set) {
System.out.println(str);
}
}
3.Map總結
HashMap:鍵值對,key不能重複,但是value可以重複;key的實作就是HashSet;value對應着放;允許null的鍵或值;
Hashtable:線程安全的,不允許null的鍵或值;
Properties::key和value都是String類型,用來讀配置檔案;
TreeMap:對key排好序的Map; key 就是TreeSet,value對應每個key; key要實作Comparable接口或TreeMap有自己的構造器;
LinkedHashMap: 此實作與 HashMap的不同之處在于,後者維護着一個運作于所有條目的雙重連結清單。存儲的資料是有序的。
levit應用中使用集合分布表:
集合類型 | 應用數量 |
HashMap | 142處 |
Hashtable | |
Properties | |
TreeMap | |
LinkedHashMap | 3 |
分析:從以上的分析結果來看與List的分析結果大緻相同,HashMap應用場景最多。
Map周遊的五種方式
[java] view plain copy print ?
- public static void testMap(){
- //Map 無序key值不重複
- Map<String, String> map = new HashMap<String, String>();
- map.put("zhangsan", "我是張三");
- map.put("devin", "我是dw");
- map.put("haha", "我是哈哈");
- //周遊方法一 map.keySet + for
- for(String key : map.keySet()){
- System.out.println("key="+ key + ",value=" + map.get(key));
- }
- //周遊方法二map.keySet +Iterator
- Iterator<String> iterator = map.keySet().iterator();
- while(iterator.hasNext()){
- String key1 = iterator.next().toString();
- System.out.println("key="+ key1 + ",value=" + map.get(key1));
- }
- //周遊方式三 map.values
- for (String key2 : map.values()) {
- System.out.println("value=" + key2);
- }
- //周遊方式四 map.entrySet + for
- for(Map.Entry<String,String> entry : map.entrySet()){
- System.out.println("key="+ entry.getKey() + ",value=" + entry.getValue());
- }
- //周遊方式五map.entrySet() + Iterator
- Iterator <Map.Entry<String,String>> entry = map.entrySet().iterator();
- while(entry.hasNext()){
- Map.Entry<String, String> ent = entry.next();
- System.out.println("key="+ ent.getKey() + ",value=" + ent.getValue());
- }
- }
public static void testMap(){
//Map 無序key值不重複
Map<String, String> map = new HashMap<String, String>();
map.put("zhangsan", "我是張三");
map.put("devin", "我是dw");
map.put("haha", "我是哈哈");
//周遊方法一 map.keySet + for
for(String key : map.keySet()){
System.out.println("key="+ key + ",value=" + map.get(key));
}
//周遊方法二map.keySet +Iterator
Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){
String key1 = iterator.next().toString();
System.out.println("key="+ key1 + ",value=" + map.get(key1));
}
//周遊方式三 map.values
for (String key2 : map.values()) {
System.out.println("value=" + key2);
}
//周遊方式四 map.entrySet + for
for(Map.Entry<String,String> entry : map.entrySet()){
System.out.println("key="+ entry.getKey() + ",value=" + entry.getValue());
}
//周遊方式五map.entrySet() + Iterator
Iterator <Map.Entry<String,String>> entry = map.entrySet().iterator();
while(entry.hasNext()){
Map.Entry<String, String> ent = entry.next();
System.out.println("key="+ ent.getKey() + ",value=" + ent.getValue());
}
}
4.兩個工具類 Arrays 和 Collections
1.Arrays:此類包含用來操作數組(比如排序和搜尋)的各種方法。
2.Collections:主要提供了在 collection 上進行操作的靜态方法(同步集合類方法) 。
5.使用模式(源自百度百科)
在ArrayList和Vector中,從一個指定的位置(通過索引)查找資料或是在集合的末尾增加、移除一個元素所花費的時間是一樣的,這個時間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那麼花費的時間會呈線形增長:O(n-i),其中n代表集合中元素的個數,i代表元素增加或移除元素的索引位置。為什麼會這樣呢?以為在進行上述操作的時候集合中第i和第i個元素之後的所有元素都要執行位移的操作。這一切意味着什麼呢?
這意味着,你隻是查找特定位置的元素或隻在集合的末端增加、移除元素,那麼使用Vector或ArrayList都可以。如果是其他操作,你最好選擇其他的集合操作類。比如,LinkList集合類在增加或移除集合中任何位置的元素所花費的時間都是一樣的—O(1),但它在索引一個元素的使用缺比較慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因為你可以簡單的使用索引來代替建立iterator對象的操作。LinkList也會為每個插入的元素建立對象,所有你要明白它也會帶來額外的開銷。
最後,在《Practical Java》一書中Peter Haggar建議使用一個簡單的數組(Array)來代替Vector或ArrayList。尤其是對于執行效率要求高的程式更應如此。因為使用數組(Array)避免了同步、額外的方法調用和不必要的重新配置設定空間的操作。
- 頂
- 4
- 踩
- 上一篇設計模式(六)擴充卡模式(Adapter)-結構型
- 下一篇判斷字元大小寫(Java)
相關文章推薦
- • Java集合Set、List、Map的周遊方法
- • Go語言程式設計入門實戰技巧
- • Java系列-Set、List、Map的周遊總結
- • 機器學習大咖在等你
- • Java集合Collection、List、Set、Map使用詳解
- • Android高手進階
- • Java集合List、Set、Map的周遊方法
- • 深入探究Linux/VxWorks的裝置樹
- • java集合 list collection map set使用
- • SDCC 2017之區塊鍊技術實戰線上峰會
- • JAVA:LIST SET和MAP的差別 + Map的三種周遊方法
- • SDCC 2017之大資料技術實戰線上峰會
- • Java中list.map.set基本概念,方法比較和周遊方式
- • java中List、Set、Map集合的周遊方法總結
- • Java集合Set、List、Map的周遊方法
- • Redis java連接配接 list,string set map