集合可以看作一個容器,集合中的對象可以很容易存放到集合中,也很容易將其從集合中取出來,還可以按一定的順序擺放。Java中提供了不同的集合類,這些類具有不同的存儲對象的方式,並提供了相應的方法方便用戶對集合進行遍歷。
集合的長度是可變的,用來存放對象的引用。常見的集合類有List集合、Set集合、Map集合。
一.集合類接口
以下接口的常用方法有很多,這里只提其中重要的幾個方法,其它方法在使用時可參照API。
1. List接口
List是列表類型,以線性方式存儲對象,自身的方法都與索引有關,個別常用方法如下。
方法 | 返回值 | 功能描述 |
add(int index, Object obj) | void | 用來向集合中的指定索引位置添加對象,集合的索引位置從0開始,其他對象的索引位置相對向后移一位 |
set(int index, E element) | Object | 用指定元素替換列表中指定位置的元素,返回以前在指定位置的元素 |
indexOf(Object obj) | int | 返回列表中對象第一次出現的索引位置,如果集合中不包含該元素則返回-1 |
lastIndexOf(Object obj) | int | 返回列表中對象最后一次出現的索引位置,如果集合匯總不包含該元素則返回-1 |
listIterator() | ListIterator | 用來獲得一個包含所有對象的ListIterator迭代器 |
下面舉一個實例,看看如何創建並添加修改集合元素。
1 import java.util.Iterator; 2 import java.util.LinkedList; 3 import java.util.List; 4 5 public class CollectionDemoList { 6 7 public static void main(String[] args) { 8 String aString = "A", bString = "B", cString = "C", dString = "D", eString = "E"; 9 10 List<String> list = new LinkedList<>(); // 創建list集合對象 11 list.add(aString); // 向集合中添加元素 12 list.add(bString); 13 list.add(eString); 14 // 輸出語句,用迭代器 15 Iterator<String> iter = list.iterator(); // 創建集合迭代器 16 while(iter.hasNext()) { // 遍歷集合中的元素 17 System.out.print(iter.next() + " "); 18 } 19 20 System.out.println(); // 換行 21 list.set(1, cString); // 將索引位置1的對象修改為對象bString 22 Iterator<String> it = list.iterator(); 23 while(it.hasNext()) { 24 System.out.print(it.next() + " "); 25 } 26 } 27 28 }
上述代碼中,add()方法用於向集合中添加元素,set()方法用於修改集合中的元素,迭代器用於遍歷集合中的元素並輸出(會在下面的內容中涉及)。運行結果如下:
其中創建List集合對象時,“<>”中是集合匯總元素的類型,如上方的String表示集合中的元素由String字符串構成。因為List是一個接口,所以new的是接口的實現類,在Eclipse中光標放在List上按Ctrl+T就可以看見List接口的所有實現類了。
2. Set接口
Set接口常用方法如下。
方法 | 返回值 | 功能描述 |
add(Object obj) | boolean | 若集合中尚存在未指定的元素,則添加此元素 |
addAll(Collection col) | boolean | 將參數集合中所有元素添加到集合的尾部 |
remove(Object obj) | boolean | 將指定的參數對象移除 |
clear() | void | 移除此Set中的所有元素 |
iterator() | Iterator | 返回此Set中的元素上進行迭代的迭代器 |
size() | int | 返回此Set集合中的所有元素數 |
isEmpty() | boolean | 如果Set不包含元素,則返回true |
下面看一個例子,用addAll()方法把List集合對象存入到Set集合中並除掉重復值。
1 import java.util.ArrayList; 2 import java.util.HashSet; 3 import java.util.Iterator; 4 import java.util.List; 5 import java.util.Set; 6 7 public class CollectionDemoSet { 8 9 public static void main(String[] args) { 10 List<String> list = new ArrayList<>(); // 創建List集合對象 11 list.add("dog"); 12 list.add("cat"); 13 list.add("fish"); 14 list.add("cat"); //重復值 15 16 Set<String> set = new HashSet<>(); // 創建List對象集合 17 set.addAll(list); // 將List集合對象添加到Set集合中 18 Iterator<String> it = set.iterator(); 19 while(it.hasNext()) { 20 System.out.print(it.next() + " "); 21 } 22 } 23 24 }
同理,創建Set對象集合時,Set是一個接口,new的是接口的實現類。運行結果如下:
由於Set集合中的對象是無序的,遍歷Set集合的結果與插入Set集合的順序並不相同。
3. Map接口
Map接口提供了將鍵映射到值的對象,一個映射不能包含重復的鍵,每個鍵最多只能映射一個值。Map接口同樣提供了clear()、isEmpty()、size()等方法,還有一些常用方法如下。
方法 | 返回值 | 功能描述 |
put(key k, value v) | Object | 向集合中添加指定的key與value的映射關系 |
get(Object key) | boolean | 如果存在指定的鍵對象,則返回該對象對應的值,否則返回null |
values() | Collection | 返回該集合中所有值對象形成的Collection集合 |
下面看一個例子。
1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class MapDemo { 5 6 public static void main(String[] args) { 7 Map<String, String> map = new HashMap<>(); // 創建Map集合 8 map.put("1", "dog"); 9 map.put("2", "cat"); 10 map.put("3", "fish"); 11 for(int i=1; i<=3; i++) { 12 System.out.println("第" + i + "個元素是:" + map.get("" + i + "")); 13 } 14 } 15 16 }
具體寫法參照上例即可。運行結果如下:
創建Map集合時,Map接口的“<>”中含有兩個類型,分別對應其key與value。
二、集合類接口的實現類
上面在定義一個接口時,都有new一個實現類,下面介紹幾種常用的實現類。
1. List接口的實現類
List接口的實現類常用的有ArrayList和LinkedList,這兩個實現類在上面的例子中已經出現過了。
ArrayList類實現了可變的數組,可以根據索引位置對集合進行快速的隨機訪問。LinkedList類采用鏈表結構保存對象,便於向集合中插入和刪除對象。對於線性結構和鏈式結構不清楚的朋友可以看我之前的博客“數據的存儲結構”,鏈接:http://www.cnblogs.com/adamjwh/p/5829604.html,也可以自行查閱資料。
分別通過ArrayList和LinkedList類實例化List集合如下:
List list1 = new ArrayList(); List list2 = new LinkedList();
2. Set接口的實現類
Set接口的實現類常用的有HashSet和TreeSet,實現如下:
Set<String> set1 = new HashSet<String>(); Set<String> set2 = new TreeSet<String>();
3. Map接口的實現類
Map接口的實現類常用的有HashMap和TreeMap,建議使用HashMap(效率相對較高)。
實現如下:
Map map = new HashMap(); Map map = new TreeMap();
三、迭代器
迭代器是利用Iterator接口創建的,在上面已經出現過了。如下是上方Set接口中的代碼:
Iterator<String> it = set.iterator(); // 創建一個迭代器 while(it.hasNext()) { System.out.print(it.next() + " "); }
上述代碼用Iterator接口和iterator()方法創建了一個迭代器;用while循環遍歷這個集合,hasNext()方法是循環判斷條件,即如果有元素可以迭代,返回true,循環繼續執行;next()方法是返回迭代的下一個元素。除了這兩個方法外,Iterator接口還有一個方法是remove(),用於從迭代器指向的collection中移除迭代器返回的最后一個元素。