第10篇-JAVA 集合框架-JAVA 泛型
第10篇-JAVA 集合框架-JAVA 泛型
每篇一句 :所有的不甘,都是因為還心存夢想
初學心得: 不是每件事都註定會成功,但是每件事都值得一試
(筆者:JEEP/711)[JAVA筆記 | 時間:2017-04-15| JAVA 集合框架/JAVA 泛型 ]
1.JAVA 集合框架概念
通俗的說,集合就是一個存放數據的容器,準確的說,就是放數據對象引用的容器
數組和集合都是容器,有何不同?
數組長度固定,集合長度可變
數組只能存放相同類型的數據,集合可以存放不同類型的數據
數組可存放簡單數據類型和類類型的數據,集合只能存放類類型數據
JAVA集合框架:java中用來表示集合,和操作集合的所有類庫的統稱JAVA中的集合從大方向分有兩種:Collection 集合,Map 集合,它們都繼承自Object
Collection又有兩個分支
1.List(列表),2.Set(集合),List和Set也都是接口
List接口的特點: 集合中的元素有順序,能重復集合中分為三大接口:
Collcction、Map(映射)、Itcrator(叠代的父類接口)
集合框架的接口和類在java.util包中
Collcction分支為兩個子接口list(列表接口),set(集合接口)集合框架List接口
有序的接口,此接口的用戶可以對列表中的每個元素的插入位置進行
精確的控制,用戶可以根據元素的整數索引(在列表中的位置)訪問元素,並索列表中的元素List實現類:ArrayList,Vector,LinkedList
1.ArrayList是底層用數組實現的List
特點:查詢效率高,增刪效率低, 線程不安全
2.LinkedList是底層用雙向循環鏈表實現的List
特點:查詢效率低,增刪效率高
3.Vector: 底層用數組實現List接口的另一個類
特點:重量級,占據更多的系統開銷,線程安全集合框架Set接口
Set接口特點是集合中的元素無順序(存入和取出的順序不一定一致),不能重復
Set接口一個不包含重復元素的collection,更確切的講,set不包含滿足e1.euuals(e2)的元素
對e1和e2,並且最多包含一個null元素,正如其名稱所暗示的,此接口模仿了數學上的ste抽象HashSet類實現Set接口,由哈希表(實際上是一個HashMap實例)支持,它不保證set的叠代順序,特別是它不保證該順序恒久不變,此類允許使用null元素
TreeSet,LinkedHashSetSet和List的區別
● 1. Set 接口實例存儲的是無序的,不重復的數據。List 接口實例存儲的是有序的,可以重復的元素
● 2. Set檢索效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變 <實現類有HashSet,TreeSet>
● 3. List和數組類似,可以動態增長,根據實際存儲的數據的長度自動增長List的長度。查找元素效率高,插入刪除效率低,因為會引起其他元素位置改變 <實現類有ArrayList,LinkedList,Vector>
Set分支的常用類有:HashSet,TreeSet
1.HashSet:底層數據結構是哈希表
特點:增、刪集合中的元素速度快
2.TreeSet集合中的元素除了沒有順序和不能重復外,還會自然排序,這便是該集合的特點集合框架Map接口
Map接口
特點:K與V,鍵值對,映射所維護的鍵的類型,映射值得類型
將鍵映射到值得對象,一個映射不能包含重復的鍵,每個鍵最多只能映射一個值
HashMap,Hashtable,TreeMap,LinkedHashMap
1.HashMap:特點:線程不安全 允許key或者value是null值
2.TreeMap特點:按照鍵值排序,線程不安全
2.JAVA 集合實現類(集合類)
Java提供了一套實現了Collection接口的標準集合類。其中一些是具體類,這些類可以直接拿來使用,而另外一些是抽象類,提供了接口的部分實現
序號 類描述 1 AbstractCollection 實現了大部分的集合接口 2 AbstractList 繼承於AbstractCollection 並且實現了大部分List接口 3 AbstractSequentialList 繼承於 AbstractList ,提供了對數據元素的鏈式訪問而不是隨機訪問 4 LinkedList該類實現了List接口,允許有null(空)元素。主要用於創建鏈表數據結構,該類沒有同步方法,如果多個線程同時訪問一個List,則必須自己實現訪問同步,解決方法就是在創建List時候構造一個同步的List。例如:Listlist=Collections.synchronizedList(newLinkedList(…));LinkedList 查找效率低 5 ArrayList該類也是實現了List的接口,實現了可變大小的數組,隨機訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。ArrayList 增長當前長度的50%,插入刪除效率低 6 AbstractSet 繼承於AbstractCollection 並且實現了大部分Set接口 7 HashSet該類實現了Set接口,不允許出現重復元素,不保證集合中元素的順序,允許包含值為null的元素,但最多只能一個 8 LinkedHashSet具有可預知叠代順序的 Set 接口的哈希表和鏈接列表實現 9 TreeSet該類實現了Set接口,可以實現排序等功能 10 AbstractMap 實現了大部分的Map接口 11 HashMap HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射,該類實現了Map接口,根據鍵的HashCode值存儲數據,具有很快的訪問速度,最多允許一條記錄的鍵為null,不支持線程同步 12 TreeMap 繼承了AbstractMap,並且使用一顆樹 13 WeakHashMap 繼承AbstractMap類,使用弱密鑰的哈希表 14 LinkedHashMap 繼承於HashMap,使用元素的自然順序對元素進行排序 15 IdentityHashMap 繼承AbstractMap類,比較文檔時使用引用相等
3.叠代器
什麽是叠代器?叠代器就是取出集合元素的方式
遍歷一個集合中的元素,例如,顯示集合中的每個元素
一般遍歷數組都是采用for循環或者增強for,這兩個方法也可以用在集合框架,但是還有一種方法是采用叠代器遍歷集合框架,它是一個對象,實現了Iterator 接口或ListIterator接口
叠代器,使你能夠通過循環來得到或刪除集合的元素
ListIterator 繼承了Iterator,以允許雙向遍歷列表和修改元素1.叠代器方法: 2.使用 Java Iterator,通過實例列出Iterator和listIterator接口提供的所有方法遍歷 ArrayList:
1.public class Demo{ 2.public static void main(String[] args) { 3. List<String> list=new ArrayList<String>(); //實例化List集合 4. list.add("Hello"); //添加元素 5. list.add("World"); 6. list.add("HAHAHAHA"); 7. //第一種遍歷方法使用foreach遍歷List 8. for (String str : list) { 9. //也可以改寫for(int i=0;i<list.size();i++)這種形式 10. System.out.println(str); 11. } 12. //第二種遍歷,把鏈表變為數組相關的內容進行遍歷 13. String[] strArray=new String[list.size()]; 14. list.toArray(strArray); 15. for(int i=0;i<strArray.length;i++) //這裏也可以改寫為 foreach(String str:strArray)這種形式{ 16. System.out.println(strArray[i]); 17. } 18. //第三種遍歷 使用叠代器進行相關遍歷 19. Iterator<String> ite=list.iterator(); 20. while(ite.hasNext()){ //判斷下一個元素之後有值 21. System.out.println(ite.next()); 22. } 23. } 24.}三種方法都是用來遍歷ArrayList集合
第三種方法是采用叠代器的方法,該方法可以不用擔心在遍歷的過程中會超出集合的長度
遍歷 Map:
1.public class Demo2{ 2. public static void main(String[] args) { 3. Map<String, String> map = new HashMap<String, String>(); //實例化Map集合 4. map.put("1", "value1"); //添加元素 5. map.put("2", "value2"); 6. map.put("3", "value3"); 7. //NO1.:普遍使用,二次取值 8. System.out.println("通過Map.keySet遍歷key和value:"); 9. for (String key : map.keySet()) { 10. System.out.println("key= "+ key + " and value= " + map.get(key)); 11. } 12. //NO2. 13. System.out.println("通過Map.entrySet使用iterator遍歷key和value:"); 14. Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); 15. while (it.hasNext()) { 16. Map.Entry<String, String> entry = it.next(); 17. System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); 18. } 19. //NO3.:容量大時推薦使用此方法 20. System.out.println("通過Map.entrySet遍歷key和value"); 21. for (Map.Entry<String, String> entry : map.entrySet()) { 22. System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); 23. } 24. //NO4. 25. System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key"); 26. for (String v : map.values()) { 27. System.out.println("value= " + v); 28. } 29. } 30.}集合是一個對象,可容納其他對象的引用。集合接口聲明對每一種類型的集合可以執行的操作,集合框架的類和接口均在java.util包中
任何對象加入集合類後,自動轉變為Object類型,所以在取出的時候,需要進行強制類型轉換
4.JAVA 泛型
泛型的本質是參數化類型,所操作的數據類型被指定為一個參數
泛型方法:方法在調用時可以接收不同類型的參數。根據傳遞給泛型方法的參數類型,編譯器適當地處理每一個方法調用
定義泛型方法的規則:
● 所有泛型方法聲明都有一個類型參數聲明部分(由尖括號分隔),該類型參數聲明部分在方法返回類型之前
● 每一個類型參數聲明部分包含一個或多個類型參數,參數間用逗號隔開。一個泛型參數,也被稱為一個類型變量,是用指定一個泛型類型名稱的標識符
● 類型參數能被用來聲明返回值類型,並且能作為泛型方法得到的實際參數類型的占位符
● 泛型方法體的聲明和其他方法一樣。註意類型參數只能代表引用型類型1.public class Demo3{ 2. // 泛型方法 printArray 3. public static < E > void printArray( E[] inputArray ){ 4. // 輸出數組元素 5. for ( E element : inputArray ){ 6. System.out.printf( "%s ", element ); 7. } 8. System.out.println(); 9. } 10. 11. public static void main( String args[] ){ 12. // 創建不同類型數組: Integer, Double 和 Character 13. Integer[] intArray = { 1, 2, 3, 4, 5 }; 14. Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; 15. Character[] charArray = { ‘H‘, ‘E‘, ‘L‘, ‘L‘, ‘O‘ }; 16. System.out.println( "整型數組元素為:" ); 17. printArray( intArray ); // 傳遞一個整型數組 18. System.out.println( "\n雙精度型數組元素為:" ); 19. printArray( doubleArray ); // 傳遞一個雙精度型數組 20. System.out.println( "\n字符型數組元素為:" ); 21. printArray( charArray ); // 傳遞一個字符型數組 22. } 23.}泛型類
泛型類的聲明和非泛型類的聲明類似,除了在類名後面添加了類型參數聲明部分
和泛型方法一樣,泛型類的類型參數聲明部分也包含一個或多個類型參數,參數間用逗號隔開。一個泛型參數,也被稱為一個類型變量,是用於指定一個泛型類型名稱的標識符,接受一個或多個參數,這些類被稱為參數化的類或參數化的類型1.public class Demo4<T> { 2. private T t; 3.public void add(T t) { 4. this.t = t; 5. } 6. public T get() { 7. return t; 8. } 9. public static void main(String[] args) { 10. Demo4<Integer> integerDemo = new Demo4<Integer>(); 11. Demo4<String> stringDemo = new Demo4<String>(); 12. integerDemo.add(new Integer(10)); 13. stringDemo.add(new String("泛型類")); 14. System.out.printf("整型值為 :%d\n\n", integerDemo.get()); 15. System.out.printf("字符串為 :%s\n", stringDemo.get()); 16. } 17.}
初學(JAVA 集合框架/JAVA 泛型 高級階段) 難點: ★★★★★
希望每一篇文章都能夠對讀者們提供幫助與提升,這乃是每一位筆者的初衷
感謝您的閱讀 歡迎您的留言與建議
FaceBook:JEEP SevenEleven
Twitter:@JEEP7ll
新浪官方微博: @中國熱點影視傳媒
Github博客: https://github.com/jeep711/jeep711.github.io
Blog Garden:http://www.cnblogs.com/JEEP711/
W3C/Blog:http://www.w3cschool.cn/jeep711blog/
CSDN/Blog:http://blog.csdn.net/jeep911
51CTO/Blog:http://jeep711.blog.51cto.com/
碼雲:http://git.oschina.net/JEEP711/jeep711.github.io
郵箱: [email protected],[email protected]
本文出自 “JEEP711” 博客,請務必保留此出處http://jeep711.blog.51cto.com/12970787/1941723
第10篇-JAVA 集合框架-JAVA 泛型