日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

      首頁編程開發(fā)java → Java集合類介紹

      Java集合類介紹

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2012/12/17 22:11:43字體大小:A-A+

      作者:西西點擊:0次評論:0次標簽: 集合

      • 類型:系統(tǒng)其它大。213KB語言:中文 評分:10.0
      • 標簽:
      立即下載

      數(shù)組是一種很常見的數(shù)據(jù)結(jié)構(gòu),開始接觸編程的時候多數(shù)程序都和數(shù)組相關(guān)。剛開始接觸Java時也是一直使用數(shù)組寫一些程序,后來越來越覺得數(shù)組這東西沒法滿足需求了,這時一位“前輩”對我說了一句:不會用集合類就等于沒學過Java。然后才知道有集合類。

      java集合類分為:set、list、map、queue四大體系。其中set代表無序、不可重復(fù)的集合;list代表有序、可重復(fù)的集合。map代表具有映射關(guān)系的集合;queue代表隊列集合。

      Java集合類與數(shù)組的區(qū)別:Java的集合類的長度是動態(tài)的,數(shù)組則是固定長度的。

      Java集合類與數(shù)組的聯(lián)系:使用相應(yīng)的toArray()和Arrays.asList()方法可以回想轉(zhuǎn)換。

      想想已經(jīng)是3、4年前的事了,時間如白駒過隙啊。

      什么時候數(shù)組會顯得力不從心,沒法滿足需求,需要集合類呢?

      1、不知道具體數(shù)據(jù)長度

      2、需要自動排序

      3、存儲鍵值對

      當然,上面的情況不是絕對的,只是數(shù)組比較難滿足。這時集合類(也可稱為容器類)就顯示了它強大的功能。

      集合類的分類

      上圖中不包含Queue內(nèi)容,部分Map的實現(xiàn)類未給出。

      常見使用的有List、Set、Map及他們的實現(xiàn)類。

      List、Set、Map接口及各實現(xiàn)類的特性

      接口特性實現(xiàn)類實現(xiàn)類特性成員要求
      List線性、有序的存儲容器,可通過索引訪問元素ArrayList數(shù)組實現(xiàn)。非同步。 
      Vector類似ArrayList,同步。 
      LinkedList雙向鏈表。非同步。 
      Map保存鍵值對成員HashMap基于哈希表的 Map 接口的實現(xiàn),滿足通用需求任意Object對象,如果修改了equals方法,需同時修改hashCode方法
      TreeMap默認根據(jù)自然順序進行排序,或者根據(jù)創(chuàng)建映射時提供的 Comparator進行排序鍵成員要求實現(xiàn)caparable接口,或者使用Comparator構(gòu)造TreeMap。鍵成員一般為同一類型。
      LinkedHashMap類似于HashMap,但迭代遍歷時取得“鍵值對”的順序是其插入順序或者最近最少使用的次序與HashMap相同
      IdentityHashMap使用==取代equals()對“鍵值”進行比較的散列映射成員通過==判斷是否相等
      WeakHashMap弱鍵映射,允許釋放映射所指向的對象 
      ConcurrentHashMap線性安全的Map 
      Set成員不能重復(fù)HashSet為快速查找設(shè)計的Set元素必須定義hashCode()
      TreeSet保持次序的Set,底層為樹結(jié)構(gòu)元素必須實現(xiàn)Comparable接口
      LinkedHashSet內(nèi)部使用鏈表維護元素的順序(插入的次序)元素必須定義hashCode()

      在滿足要求的情況下,Map應(yīng)盡量使用HashMap,Set應(yīng)盡量使用HashSet。

      集合類的基本使用

      List

      List基本操作

       
       1 ArrayList arrayList = new ArrayList();
       2         arrayList.add("Tom");
       3         arrayList.add("Jerry");
       4         arrayList.add("Micky");
       5         // 使用Iterator遍歷元素
       6         Iterator it = arrayList.iterator();
       7         while (it.hasNext()) {
       8             String str = it.next();
       9             System.out.println(str);
      10         }
      11         // 在指定位置插入元素
      12         arrayList.add(2, "Kate");
      13         // 通過索引直接訪問元素
      14         for (int i = 0; i < arrayList.size(); i++) {
      15             System.out.println(arrayList.get(i));
      16         }
      17         List subList = new ArrayList();
      18         subList.add("Mike");
      19         // addAll(Collection<? extends String> c)添加所給集合中的所有元素
      20         arrayList.addAll(subList);
      21         // 判斷是否包含某個元素
      22         if (arrayList.contains("Mike")) {
      23             System.out.println("Mike is include in the list");
      24         }
      25 
      26         LinkedList linkedList = new LinkedList();
      27         linkedList.addAll(arrayList);
      28         // 獲取指定元素
      29         System.out.println(linkedList.get(4));
      30         // 獲取第一個元素
      31         System.out.println(linkedList.getFirst());
      32         // 獲取最后一個元素
      33         System.out.println(linkedList.getLast());
      34         // 獲取并刪除第一個元素
      35         System.out.println(linkedList.pollFirst());
      36         // 獲取,但不移除第一個元素
      37         System.out.println(linkedList.peekFirst());

      ArrayList和LinkedList的效率比較

      ArrayList添加元素的效率

       1 ArrayList arrList = new ArrayList();
       2         long startTimeMillis, endTimeMillis;
       3         startTimeMillis = System.currentTimeMillis();
       4         for (int i = 0; i < 10000; i++) {
       5             arrList.add(0, "addString");
       6         }
       7         endTimeMillis = System.currentTimeMillis();
       8         System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)
       9                 + "ms");
      10 
      11         arrList.clear();
      12 
      13         startTimeMillis = System.currentTimeMillis();
      14         for (int i = 0; i < 20000; i++) {
      15             arrList.add(0, "addString");
      16         }
      17         endTimeMillis = System.currentTimeMillis();
      18         System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)
      19                 + "ms");
      20 
      21         arrList.clear();
      22 
      23         startTimeMillis = System.currentTimeMillis();
      24         for (int i = 0; i < 40000; i++) {
      25             arrList.add(0, "addString");
      26         }
      27         endTimeMillis = System.currentTimeMillis();
      28         System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)
      29                 + "ms");
      30 
      31         arrList.clear();
      32 
      33         startTimeMillis = System.currentTimeMillis();
      34         for (int i = 0; i < 80000; i++) {
      35             arrList.add(0, "addString");
      36         }
      37         endTimeMillis = System.currentTimeMillis();
      38         System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)
      39                 + "ms");
      40 
      41         arrList.clear();
      42 
      43         startTimeMillis = System.currentTimeMillis();
      44         for (int i = 0; i < 160000; i++) {
      45             arrList.add(0, "addString");
      46         }
      47         endTimeMillis = System.currentTimeMillis();
      48         System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)
      49                 + "ms");
      50 
      51         arrList.clear();
      52 
      53         startTimeMillis = System.currentTimeMillis();
      54         for (int i = 0; i < 320000; i++) {
      55             arrList.add(0, "addString");
      56         }
      57         endTimeMillis = System.currentTimeMillis();
      58         System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis)
      59                 + "ms");

      執(zhí)行時間比較

      執(zhí)行次數(shù)(在0號位置插入)ArrayList所用時間(ms)LinkedList所用時間(ms)
      10000310
      200001410
      4000048416
      8000019850
      16000079060
      3200003171916
      執(zhí)行次數(shù)(在尾部插入)ArrayList所用時間(ms)LinkedList所用時間(ms)
      1000000
      20000150
      4000000
      8000000
      160000015
      320000016
      循環(huán)輸出次數(shù)(get(index)方法)ArrayList所用時間(ms)LinkedList所用時間(ms)
      1000093204
      20000188797
      400003282734
      8000068813328
      160000159462313
      3200002765太久了……

      因為ArrayList底層由數(shù)組實現(xiàn),在0號位置插入時將移動list的所有元素,在末尾插入元素時不需要移動。LinkedList是雙向鏈表,在任意位置插入元素所需時間均相同。所以在List中有較多插入和刪除操作的情況下應(yīng)使用LinkedList來提高效率,而有較多索引查詢的時候使用ArrayList(使用增強型的for循環(huán)或Iterator遍歷LinkedList效率將提高很多)。

      Map

      Map基本操作

       1 HashMap map = new HashMap();
       2         // 向Map中添加元素
       3         map.put("Tom", 26);
       4         map.put("Jack", 18);
       5         map.put("Micky", 17);
       6         map.put("Kate", 15);
       7         // 根據(jù)Key獲取Value
       8         System.out.println("Jack is " + map.get("Jack") + " years old");
       9         // 移除
      10         map.remove("Micky");
      11         // 遍歷Map
      12         for (Entry entry : map.entrySet()) {
      13             System.out.println("name:" + entry.getKey() + " age:"
      14                     + entry.getValue());
      15         }
      16         // Key相同的元素將被覆蓋
      17         map.put("Jack", 19);
      18         // 根據(jù)Key獲取Value
      19         System.out.println("Jack is " + map.get("Jack") + " years old");
      20         // 判斷是否包含某個Key
      21         if (map.containsKey("Tom")) {
      22             System.out.println(map.get("Tom"));
      23         }
      24         // 判斷是否包含某個Value
      25         if (map.containsValue(26)) {
      26             System.out.println("The map include the value 26");
      27         }
      28         // 判斷map是否為空
      29         if (!map.isEmpty()) {
      30             // 獲取map大小
      31             System.out.println("The map's size=" + map.size());
      32         }
      33         // 獲取Key的集合
      34         for (String str : map.keySet()) {
      35             System.out.println(str);
      36         }
      37 
      38         TreeMap treeMap = new TreeMap();
      39         treeMap.putAll(map);
      40         // 輸出內(nèi)容按照key值排序
      41         for (Entry entry : treeMap.entrySet()) {
      42             System.out.println("name:" + entry.getKey() + " age:"
      43                     + entry.getValue());
      44             // name:Jack age:19
      45             // name:Kate age:15
      46             // name:Tom age:26
      47         }
      48 
      49         LinkedHashMap linkedHashMap = new LinkedHashMap();
      50         // 向Map中添加元素
      51         linkedHashMap.put("Tom", 26);
      52         linkedHashMap.put("Jack", 18);
      53         linkedHashMap.put("Micky", 17);
      54         linkedHashMap.put("Kate", 15);
      55         // 保持了插入的順序
      56         for (Entry entry : linkedHashMap.entrySet()) {
      57             System.out.println("name:" + entry.getKey() + " age:"
      58                     + entry.getValue());
      59             // name:Tom age:26
      60             // name:Jack age:18
      61             // name:Micky age:17
      62             // name:Kate age:15
      63         }

      Set

      Set基本操作

       1 HashMap map = new HashMap();
       2         // 向Map中添加元素
       3         map.put("Tom", 26);
       4         map.put("Jack", 18);
       5         map.put("Micky", 17);
       6         map.put("Kate", 15);
       7         // 根據(jù)Key獲取Value
       8         System.out.println("Jack is " + map.get("Jack") + " years old");
       9         // 移除
      10         map.remove("Micky");
      11         // 遍歷Map
      12         for (Entry entry : map.entrySet()) {
      13             System.out.println("name:" + entry.getKey() + " age:"
      14                     + entry.getValue());
      15         }
      16         // Key相同的元素將被覆蓋
      17         map.put("Jack", 19);
      18         // 根據(jù)Key獲取Value
      19         System.out.println("Jack is " + map.get("Jack") + " years old");
      20         // 判斷是否包含某個Key
      21         if (map.containsKey("Tom")) {
      22             System.out.println(map.get("Tom"));
      23         }
      24         // 判斷是否包含某個Value
      25         if (map.containsValue(26)) {
      26             System.out.println("The map include the value 26");
      27         }
      28         // 判斷map是否為空
      29         if (!map.isEmpty()) {
      30             // 獲取map大小
      31             System.out.println("The map's size=" + map.size());
      32         }
      33         // 獲取Key的集合
      34         for (String str : map.keySet()) {
      35             System.out.println(str);
      36         }
      37 
      38         TreeMap treeMap = new TreeMap();
      39         treeMap.putAll(map);
      40         // 輸出內(nèi)容按照key值排序
      41         for (Entry entry : treeMap.entrySet()) {
      42             System.out.println("name:" + entry.getKey() + " age:"
      43                     + entry.getValue());
      44             // name:Jack age:19
      45             // name:Kate age:15
      46             // name:Tom age:26
      47         }
      48 
      49         LinkedHashMap linkedHashMap = new LinkedHashMap();
      50         // 向Map中添加元素
      51         linkedHashMap.put("Tom", 26);
      52         linkedHashMap.put("Jack", 18);
      53         linkedHashMap.put("Micky", 17);
      54         linkedHashMap.put("Kate", 15);
      55         // 保持了插入的順序
      56         for (Entry entry : linkedHashMap.entrySet()) {
      57             System.out.println("name:" + entry.getKey() + " age:"
      58                     + entry.getValue());
      59             // name:Tom age:26
      60             // name:Jack age:18
      61             // name:Micky age:17
      62             // name:Kate age:15
      63         }

      本文沒有對ArrayList及HashMap進行深入的分析,這兩個類是集合類中最常用的類,將另開文章進行深入剖析。

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)
        推薦文章

        沒有數(shù)據(jù)