標籤:exception ase work 不能 參數 使用 子類 contain xtend
集合架構(collections framework)1.兩大基類Collection與Map
1).public interface Collection<E>extends Iterable<E>:Collection表示一組純資料
Collection繼承自Iterable介面,而Iterable介面中提供有能直接擷取iterator對象的方法,所以所有繼承自Iterable的集合都可以使用iterator迭代
2)Map表示一組key-value對
一般繼承自Collection或Map的集合類,會提供兩個“標準”的建構函式:
Collection的繼承架構
這裡只給出了比較常用的類
如所示,Collection類主要有三個介面:
Set表示不允許有重複元素的集合(但是可以為null)(A collection that contains no duplicate elements)
List表示允許有重複元素的集合(An ordered collection (also known as a sequence))
Queue JDK1.5新增,與上面兩個集合類主要是的區分在於Queue主要用於儲存資料,而不是處理資料。(A collection designed for holding elements prior to processing.)
map的繼承架構
Map並不是一個真正意義上的集合(are not true collections),但是這個介面提供了三種“集合視角”(collection views ),使得可以像操作集合一樣操作它們,具體如下:
map的內容看作key的集合(map’s contents to be viewed as a set of keys
- 把map的內容看作value的集合(map’s contents to be viewed as a collection of values)
Map<String,String> map = new HashMap<String,String>(); map.put("01", "zhangsan"); map.put("02", "lisi"); map.put("03", "wangwu"); Set<String> keySet = map.keySet();//先擷取map集合的所有鍵的Set集合 Iterator<String> it = keySet.iterator();//有了Set集合,就可以擷取其迭代器。 while(it.hasNext()){ String key = it.next(); String value = map.get(key);//有了鍵可以通過map集合的get方法擷取其對應的值。 System.out.println("key: "+key+"-->value: "+value);//獲得key和value值 }通過keyset()迭代
- 把map的內容看作key-value映射的集合(map’s contents to be viewed as a set of key-value mappings)
Map<String,String> map = new HashMap<String,String>();map.put("01", "zhangsan");map.put("02", "lisi");map.put("03", "wangwu");Collection<String> collection = map.values();//傳回值是個值的Collection集合System.out.println(collection);使用values()遍曆
- 把map的內容看作key-value映射的集合(map’s contents to be viewed as a set of key-value mappings)
Map<String,String> map = new HashMap<String,String>(); map.put("01", "zhangsan");map.put("02", "lisi");map.put("03", "wangwu");//通過entrySet()方法將map集合中的映射關係取出(這個關係就是Map.Entry類型)Set<Map.Entry<String, String>> entrySet = map.entrySet();//將關係集合entrySet進行迭代,存放到迭代器中 Iterator<Map.Entry<String, String>> it2 = entrySet.iterator(); while(it2.hasNext()){ Map.Entry<String, String> me = it2.next();//擷取Map.Entry關聯性物件me String key2 = me.getKey();//通過關聯性物件擷取key String value2 = me.getValue();//通過關聯性物件擷取value System.out.println("key: "+key2+"-->value: "+value2);}通過entrySet()遍曆,推薦使用此方式,效能最高 hashMap
public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
特點:
- 線程非安全,並且允許key與value都為null值,
HashTable與之相反,為安全執行緒,key與value都不允許null值。
- 不保證其內部元素的順序,而且隨著時間的推移,同一元素的位置也可能改變(resize的情況)
- put、get操作的時間複雜度為O(1)。
- 遍曆其集合視角的時間複雜度與其容量(capacity,槽的個數)和現有元素的大小(entry的個數)成正比,所以如果遍曆的效能要求很高,不要把capactiy設定的過高或把平衡因子(load factor,當entry數大於capacity*loadFactor時,會進行resize,reside會導致key進行rehash)設定的過低。
- 由於HashMap是線程非安全的,這也就是意味著如果多個線程同時對一hashmap的集合試圖做迭代時有結構的上改變(添加、刪除entry,只改變entry的value的值不算結構改變),那麼會報ConcurrentModificationException,專業術語叫
fail-fast,儘早報錯對於多線程程式來說是很有必要的。
Map m = Collections.synchronizedMap(new HashMap(...)); 通過這種方式可以得到一個安全執行緒的map。
TreeMap
public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, Serializable
java基礎之集合架構