1. 程式人生 > >第10篇-JAVA 集合框架-JAVA 泛型

第10篇-JAVA 集合框架-JAVA 泛型

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實現類ArrayListVectorLinkedList
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元素
TreeSetLinkedHashSet

Set和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,鍵值對,映射所維護的鍵的類型,映射值得類型
將鍵映射到值得對象,一個映射不能包含重復的鍵,每個鍵最多只能映射一個值
HashMapHashtableTreeMapLinkedHashMap
1.HashMap:特點:線程不安全 允許key或者value是null值
2.TreeMap特點:按照鍵值排序,線程不安全

2.JAVA 集合實現類(集合類)

Java提供了一套實現了Collection接口的標準集合類。其中一些是具體類,這些類可以直接拿來使用,而另外一些是抽象類,提供了接口的部分實現

序號類描述
1AbstractCollection 實現了大部分的集合接口
2AbstractList 繼承於AbstractCollection 並且實現了大部分List接口
3AbstractSequentialList 繼承於 AbstractList ,提供了對數據元素的鏈式訪問而不是隨機訪問
4LinkedList該類實現了List接口,允許有null(空)元素。主要用於創建鏈表數據結構,該類沒有同步方法,如果多個線程同時訪問一個List,則必須自己實現訪問同步,解決方法就是在創建List時候構造一個同步的List。例如:Listlist=Collections.synchronizedList(newLinkedList(…));LinkedList 查找效率低
5ArrayList該類也是實現了List的接口,實現了可變大小的數組,隨機訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。ArrayList 增長當前長度的50%,插入刪除效率低
6AbstractSet 繼承於AbstractCollection 並且實現了大部分Set接口
7HashSet該類實現了Set接口,不允許出現重復元素,不保證集合中元素的順序,允許包含值為null的元素,但最多只能一個
8LinkedHashSet具有可預知叠代順序的 Set 接口的哈希表和鏈接列表實現
9TreeSet該類實現了Set接口,可以實現排序等功能
10AbstractMap 實現了大部分的Map接口
11HashMap HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射,該類實現了Map接口,根據鍵的HashCode值存儲數據,具有很快的訪問速度,最多允許一條記錄的鍵為null,不支持線程同步
12TreeMap 繼承了AbstractMap,並且使用一顆樹
13WeakHashMap 繼承AbstractMap類,使用弱密鑰的哈希表
14LinkedHashMap 繼承於HashMap,使用元素的自然順序對元素進行排序
15IdentityHashMap 繼承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 泛型