1、集合時存儲對象的最常用的方式。 2、集合類的特點:集合只用于存儲對象,集合的長度是可變的(這是不同與數組的,數組的長度是不變的),集合可以存儲不同類型的對象 3、集合框架的頂層是Collection接口,這是一個根接口,該接口中具有的共性功能包括 (1)添加元素 boolean add(Object obj) (2)刪除元素 void clear() boolean remove(Object obj) boolean removeAll(Collection c)//將原集合去掉原集合與集合c相同的元素 (3)獲取長度 int size() (4)判斷 boolean isEmpty() boolean contains(Object obj) boolean contaisAll(Collection c) (5)將集合轉成數組 toArray() toArray([]) (6)遍歷集合元素 Iterator iterator()//獲取集合中元素上迭代功能的迭代器對象 4、常用的兩個集合list和set |—–List(子接口):有序的(存入的順序和取出的順序一致),有索引。使用頻率很高,允許重復元素 List接口中的特有方法: add(index,element) remove(index) set(index,newelement) indexOf(element) get(index) List集合具體子類(數據結構不同): |—Vector:數據結構是數組,且數組是可變長度的,線程同步的。 |—ArrayList:數據結構是數組,且數組是可變長度的,線程不同步的。優點是查詢速度快,缺點是增刪速度慢 |—LinkedList:鏈表結構,線程不同步,優點是增刪速度快,缺點是查詢速度慢 特有方法: addFirst(Object obj) removeFirst(Object obj)//返回被去掉的第一個對象 如何通過LinkedList實現一個堆?;蛘哧犃袛祿Y構
PRivate LinkedList link; MyQueue(){ link = new LinkedList(); } public Object myAdd(Object obj){ link.addFisrt(obj); } public Object myGet(){ return link.removeLast(); } public boolean isNull(){ return link.isEmpty(); } }public static void main(String[] args){ MyQueue queue = new MyQueue(); queue.myAdd("aaa"); queue.myAdd("bbb"); queue.myAdd("ccc"); queue.myAdd("ddd"); while(!queue.isNull()){ system.out.println(queue.myGet()); } }|—–set:不允許重復元素(最大的區別) |—HashSet:不保證存取的順序,不允許存儲重復元素,比數組查 詢的效率高;該集合的數據結構是哈希表結構(散列表結構) 通過哈希算法算出的哈希值相同的情況就是哈希沖突,這種情況下,做進一步的判斷是否存入的數據相同(equals方法), |—TreeSet:不保證有序,同時使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決于使用的構造方法。注意:自定義對象的時候,要讓對象實現Comparable接口。 TreeSet的比較器:元素本身具備的比較功能是自然排序,如果不需要自然排序,需要自定義排序方式,而且存儲的TreeSet中的元素可能不具備比較功能。在這種情況下,可以使集合具備比較功能。 Set set = new TreeSet(new ComparatorByName);//初始化TreeSet集合時,明確一個比較器,自定義的比較器ComparatorByName實現了comparator接口,覆蓋了compare方法。 4、JDK1.5之后collection接口繼承了Iterable接口,這樣實現了接口的集合對象就可以使用foreach語句。 增強for循環:用于遍歷collection集合或者數組 格式:for(元素類型 變量 : collection或數組)
Collection coll = new ArrayList();coll.add("1");coll.add("2");coll.add("3");coll.add("4");for(Object obj : coll){System.out.println(obj);}5、Enumeration:取出元素的一種方式,枚舉,只有Vector容器具備枚舉的取出方式。 6、集合的泛型 為了運行時期不出現類型異常,可以在定義集合時就明確集合中元素的類型,API中List后面的<E>
就是指元素類型。
在JDK1.4版本之前,集合中任何類型的對象都可以存儲,在取出元素時,需要用到對象的特有內容時,需要做向下轉型,但是對象的類型不一致,就會導致向下轉型發生classcastexception異常。 JDK1.5之后,在定義集合時,就直接明確集合中存儲元素的具體類型,這樣編譯器在編譯時就可以對集合中存儲的對象類型進行檢查,一旦發現類型不匹配,就會編譯失敗,這個技術就是泛型技術。也就是說泛型其實就是編譯時期的一種安全機制。 (1)泛型的擦除:編譯器通過泛型對元素類型進行檢查,檢查通過之后生成的class文件中,就將泛型標識去掉了。也就是加不加泛型,生成的class文件是相同的。 (2)靜態方法無法訪問類上定義的泛型的。如果靜態方法需要定義泛型,泛型只能定義在方法上。 7、接口 Map<K,V>
Map是雙列集合,一次存一對對象,也就是鍵值對。要保證鍵的唯一性。 沒有繼承Iterable接口,無法用迭代器遍歷。 (1)添加元素 V put(K key,V value) (2)遍歷元素 Set<K>
keySet()—>返回此映射中包含的鍵的 Set集合 將指定的值,在用迭代器遍歷該set集合 Set<Map.Entry<K,V>>
entrySet()—>返回此映射中包含的映射關系的 Set 集合 Collection<V>
values()—>返回此映射中包含的值的 Collection 集合。該集合元素是可以重復的,因為值是可以重復的。 |—–HashTable:數據結構是哈希表,是同步的。不允許null鍵和null值。 |—–HashMap:數據結構是哈希表,是不同步的。允許null鍵和null值。(特別注意HashMap和HashTable的區別) |—–TreeMap:數據結構是二叉樹,不同步??梢詫ap集合中的鍵進行排序。 |—–LinkedHashMap
新聞熱點
疑難解答