乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java 集合類詳解

       最初九月雪 2014-05-15

      0.參考文獻(xiàn)

      http://blog.csdn.net/liulin_good/article/details/6213815

      1.java集合類圖

      1.1

      1.2

        上述類圖中,實(shí)線邊框的是實(shí)現(xiàn)類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點(diǎn)線邊框的是接口,比如Collection,Iterator,List等。

        發(fā)現(xiàn)一個(gè)特點(diǎn),上述所有的集合類,都實(shí)現(xiàn)了Iterator接口,這是一個(gè)用于遍歷集合中元素的接口,主要包含hashNext(),next(),remove()三種方法。它的一個(gè)子接口LinkedIterator在它的基礎(chǔ)上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator接口,那么在遍歷集合中元素的時(shí)候,只能往后遍歷,被遍歷后的元素不會(huì)在遍歷到,通常無序集合實(shí)現(xiàn)的都是這個(gè)接口,比如HashSet,HashMap;而那些元素有序的集合,實(shí)現(xiàn)的一般都是LinkedIterator接口,實(shí)現(xiàn)這個(gè)接口的集合可以雙向遍歷,既可以通過next()訪問下一個(gè)元素,又可以通過previous()訪問前一個(gè)元素,比如ArrayList。

        還有一個(gè)特點(diǎn)就是抽象類的使用。如果要自己實(shí)現(xiàn)一個(gè)集合類,去實(shí)現(xiàn)那些抽象的接口會(huì)非常麻煩,工作量很大。這個(gè)時(shí)候就可以使用抽象類,這些抽象類中給我們提供了許多現(xiàn)成的實(shí)現(xiàn),我們只需要根據(jù)自己的需求重寫一些方法或者添加一些方法就可以實(shí)現(xiàn)自己需要的集合類,工作流昂大大降低。

      1.3

      2.詳解

       2.1HashSet

      HashSet是Set接口的一個(gè)子類,主要的特點(diǎn)是:里面不能存放重復(fù)元素,而且采用散列的存儲(chǔ)方法,所以沒有順序。這里所說的沒有順序是指:元素插入的順序與輸出的順序不一致。

      代碼實(shí)例:HashSetDemo

      復(fù)制代碼
      package edu.sjtu.erplab.collection;
      
      import java.util.HashSet;
      import java.util.Iterator;
      import java.util.Set;
      
      public class HashSetDemo {
      
          public static void main(String[] args) {
              Set<String> set=new HashSet<String>();
              
              set.add("a");
              set.add("b");
              set.add("c");
              set.add("c");
              set.add("d");
              
              //使用Iterator輸出集合
              Iterator<String> iter=set.iterator();
              while(iter.hasNext())
              {
                  System.out.print(iter.next()+" ");
              }
              System.out.println();
              //使用For Each輸出結(jié)合
              for(String e:set)
              {
                  System.out.print(e+" ");
              }
              System.out.println();
              
              //使用toString輸出集合
              System.out.println(set);
          }
      }
      復(fù)制代碼

      代碼實(shí)例:SetTest

      復(fù)制代碼
      package edu.sjtu.erplab.collection;
      
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.InputStream;
      import java.util.HashSet;
      import java.util.Iterator;
      import java.util.Scanner;
      import java.util.Set;
      
      public class SetTest {
      
          public static void main(String[] args) throws FileNotFoundException {
              Set<String> words=new HashSet<String>();
      
              //通過輸入流代開文獻(xiàn)
              //方法1:這個(gè)方法不需要拋出異常
              InputStream inStream=SetTest.class.getResourceAsStream("Alice.txt");
              
              //方法2:這個(gè)方法需要拋出異常
              //InputStream inStream = new FileInputStream("D:\\Documents\\workspace\\JAVAStudy\\src\\edu\\sjtu\\erplab\\collection\\Alice.txt");
              Scanner in=new Scanner(inStream);
              while(in.hasNext())
              {
                  words.add(in.next());
              }
              
              Iterator<String> iter=words.iterator();
              
              for(int i=0;i<5;i++)
              {
                  if(iter.hasNext())
                  System.out.println(iter.next());
              }
              
              System.out.println(words.size());
      
          }
      }
      復(fù)制代碼

       

      2.2ArrayList

      ArrayList是List的子類,它和HashSet想法,允許存放重復(fù)元素,因此有序。集合中元素被訪問的順序取決于集合的類型。如果對ArrayList進(jìn)行訪問,迭代器將從索引0開始,每迭代一次,索引值加1。然而,如果訪問HashSet中的元素,每個(gè)元素將會(huì)按照某種隨機(jī)的次序出現(xiàn)。雖然可以確定在迭代過程中能夠遍歷到集合中的所有元素,但卻無法預(yù)知元素被訪問的次序。

      代碼實(shí)例:ArrayListDemo

      復(fù)制代碼
      package edu.sjtu.erplab.collection;
      
      import java.util.ArrayList;
      import java.util.Iterator;
      import java.util.List;
      
      public class ArrayListDemo {
          public static void main(String[] args) {
              List<String> arrList=new ArrayList<String>();
              
              arrList.add("a");
              arrList.add("b");
              arrList.add("c");
              arrList.add("c");
              arrList.add("d");
      
              //使用Iterator輸出集合
              Iterator<String> iter=arrList.iterator();
              while(iter.hasNext())
              {
                  System.out.print(iter.next()+" ");
              }
              System.out.println();
              //使用For Each輸出結(jié)合
              for(String e:arrList)
              {
                  System.out.print(e+" ");
              }
              System.out.println();
              
              //使用toString輸出集合
              System.out.println(arrList);
          }
      }
      復(fù)制代碼

      2.3LinkedList

      LinkedList是一種可以在任何位置進(jìn)行高效地插入和刪除操作的有序序列。

      代碼實(shí)例:LinkedListTest

      復(fù)制代碼
      package edu.sjtu.erplab.collection;
      
      import java.util.ArrayList;
      import java.util.Iterator;
      import java.util.List;
      import java.util.ListIterator;
      
      public class LinkedListTest {
      
          public static void main(String[] args) {
      
              List<String> a=new ArrayList<String>();
              a.add("a");
              a.add("b");
              a.add("c");
              System.out.println(a);
              
              List<String> b=new ArrayList<String>();
              b.add("d");
              b.add("e");
              b.add("f");
              b.add("g");
              System.out.println(b);
              
              //ListIterator在Iterator基礎(chǔ)上添加了add(),previous()和hasPrevious()方法
              ListIterator<String> aIter=a.listIterator();
              //普通的Iterator只有三個(gè)方法,hasNext(),next()和remove()
              Iterator<String> bIter=b.iterator();
              
              //b歸并入a當(dāng)中,間隔交叉得插入b中的元素
              while(bIter.hasNext())
              {
                  if(aIter.hasNext())
                      aIter.next();
                  aIter.add(bIter.next());
              }
              System.out.println(a);
              
              //在b中每隔兩個(gè)元素刪除一個(gè)
              bIter=b.iterator();
              
              while(bIter.hasNext())
              {
                  bIter.next();
                  if(bIter.hasNext())
                  {
                      bIter.next();//remove跟next是成對出現(xiàn)的,remove總是刪除前序
                      bIter.remove();
                  }
              }
              System.out.println(b);
              
              //刪除a中所有的b中的元素
              a.removeAll(b);
              System.out.println(a);
          }
      }
      復(fù)制代碼

       2.4HashMap

      參考之前的一篇博客:Hashmap實(shí)現(xiàn)原理

       

       2.5WeekHashMapDemo

      復(fù)制代碼
      package edu.sjtu.erplab.collection;
      
      import java.util.WeakHashMap;
      
      public class WeekHashMapDemo {
      
          public static void main(String[] args) {
              int size = 100;
      
              if (args.length > 0) {
                  size = Integer.parseInt(args[0]);
              }
      
              Key[] keys = new Key[size];
              WeakHashMap<Key, Value> whm = new WeakHashMap<Key, Value>();
      
              for (int i = 0; i < size; i++) {
                  Key k = new Key(Integer.toString(i));
                  Value v = new Value(Integer.toString(i));
                  if (i % 3 == 0) {
                      keys[i] = k;//強(qiáng)引用
                  }
                  whm.put(k, v);//所有鍵值放入WeakHashMap中
              }
      
              System.out.println(whm);
              System.out.println(whm.size());
              System.gc();
              
              try {
                  // 把處理器的時(shí)間讓給垃圾回收器進(jìn)行垃圾回收
                  Thread.sleep(4000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } 
              
              System.out.println(whm);
              System.out.println(whm.size());
          }
      
      }
      
      class Key {
          String id;
      
          public Key(String id) {
              this.id = id;
          }
      
          public String toString() {
              return id;
          }
      
          public int hashCode() {
              return id.hashCode();
          }
      
          public boolean equals(Object r) {
              return (r instanceof Key) && id.equals(((Key) r).id);
          }
      
          public void finalize() {
              System.out.println("Finalizing Key " + id);
          }
      }
      
      class Value {
          String id;
      
          public Value(String id) {
              this.id = id;
          }
      
          public String toString() {
              return id;
          }
      
          public void finalize() {
              System.out.println("Finalizing Value " + id);
          }
      
      }
      復(fù)制代碼

      輸出結(jié)果

      復(fù)制代碼
      {50=50, 54=54, 53=53, 52=52, 51=51, 46=46, 47=47, 44=44, 45=45, 48=48, 49=49, 61=61, 60=60, 63=63, 62=62, 65=65, 64=64, 55=55, 56=56, 57=57, 58=58, 59=59, 76=76, 75=75, 74=74, 73=73, 72=72, 71=71, 70=70, 68=68, 69=69, 66=66, 67=67, 85=85, 84=84, 87=87, 86=86, 81=81, 80=80, 83=83, 82=82, 77=77, 78=78, 79=79, 89=89, 88=88, 10=10, 90=90, 91=91, 92=92, 93=93, 94=94, 95=95, 96=96, 97=97, 98=98, 99=99, 20=20, 21=21, 12=12, 11=11, 14=14, 13=13, 16=16, 15=15, 18=18, 17=17, 19=19, 8=8, 9=9, 31=31, 4=4, 32=32, 5=5, 6=6, 30=30, 7=7, 0=0, 1=1, 2=2, 3=3, 29=29, 28=28, 27=27, 26=26, 25=25, 24=24, 23=23, 22=22, 40=40, 41=41, 42=42, 43=43, 38=38, 37=37, 39=39, 34=34, 33=33, 36=36, 35=35}
      100
      Finalizing Key 98
      Finalizing Key 97
      Finalizing Key 95
      Finalizing Key 94
      Finalizing Key 92
      Finalizing Key 91
      Finalizing Key 89
      Finalizing Key 88
      Finalizing Key 86
      Finalizing Key 85
      Finalizing Key 83
      Finalizing Key 82
      Finalizing Key 80
      Finalizing Key 79
      Finalizing Key 77
      Finalizing Key 76
      Finalizing Key 74
      Finalizing Key 73
      Finalizing Key 71
      Finalizing Key 70
      Finalizing Key 68
      Finalizing Key 67
      Finalizing Key 65
      Finalizing Key 64
      Finalizing Key 62
      Finalizing Key 61
      Finalizing Key 59
      Finalizing Key 58
      Finalizing Key 56
      Finalizing Key 55
      Finalizing Key 53
      Finalizing Key 52
      Finalizing Key 50
      Finalizing Key 49
      Finalizing Key 47
      Finalizing Key 46
      Finalizing Key 44
      Finalizing Key 43
      Finalizing Key 41
      Finalizing Key 40
      Finalizing Key 38
      Finalizing Key 37
      Finalizing Key 35
      Finalizing Key 34
      Finalizing Key 32
      Finalizing Key 31
      Finalizing Key 29
      Finalizing Key 28
      Finalizing Key 26
      Finalizing Key 25
      Finalizing Key 23
      Finalizing Key 22
      Finalizing Key 20
      Finalizing Key 19
      Finalizing Key 17
      Finalizing Key 16
      Finalizing Key 14
      Finalizing Key 13
      Finalizing Key 11
      Finalizing Key 10
      Finalizing Key 8
      Finalizing Key 7
      Finalizing Key 5
      Finalizing Key 4
      Finalizing Key 2
      Finalizing Key 1
      {54=54, 51=51, 45=45, 48=48, 60=60, 63=63, 57=57, 75=75, 72=72, 69=69, 66=66, 84=84, 87=87, 81=81, 78=78, 90=90, 93=93, 96=96, 99=99, 21=21, 12=12, 15=15, 18=18, 9=9, 6=6, 30=30, 0=0, 3=3, 27=27, 24=24, 42=42, 39=39, 33=33, 36=36}
      34
      復(fù)制代碼

       疑問:為什么value沒有被回收。

       

      3.比較

          是否有序 是否允許元素重復(fù)
      Collection
      List
      Set AbstractSet
        HashSet
        TreeSet 是(用二叉排序樹)
      Map AbstractMap 使用key-value來映射和存儲(chǔ)數(shù)據(jù),key必須唯一,value可以重復(fù)
        HashMap
        TreeMap 是(用二叉排序樹)

       

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多