集合

集合跟陣列類似,最大差別在陣列長度無法改變,而集合會動態調整大小,常用的集合有

set 介面 -> hashset 類別,
               -> linkedhashset 類別
               -> sortset 介面 -> treeset 類別
list 介面 -> vector 類別 -> stack 類別
              -> arraylist 類別
queue 介面 -> linkedlist 類別

collections有許多集合的好用方法,如 sort 排序等等

各類別實作範例如下

   1:  package Test_Collection;
   2:   
   3:  import java.util.*;
   4:   
   5:  public class Test_Collection 
   6:  {
   7:   
   8:      /**
   9:       * @param args
  10:       */
  11:      public static void main(String[] args) {
  12:          // TODO Auto-generated method stub
  13:   
  14:          /**HashSet使用,元素不可重複,無順序性*/
  15:          HashSet hs1 = new HashSet();
  16:          hs1.add(1);
  17:          hs1.add(2);
  18:          hs1.add(0);
  19:          hs1.add(4);
  20:          hs1.add(3);
  21:          hs1.add(0);//沒有放入hashset,因為元素不得重複,不會造成錯誤
  22:          System.out.println(hs1.size());//3
  23:          System.out.println(hs1.contains(0));//true
  24:          System.out.println(hs1.remove(0));//true
  25:          System.out.println(hs1.contains(0));//false
  26:          
  27:          Iterator ior = hs1.iterator();//使用迭代器取得hashset元素內容
  28:          while(ior.hasNext())//使用while迴圈
  29:          {
  30:              Integer i = (Integer)ior.next();
  31:              System.out.println(i);//1 2
  32:          }
  33:          for(Iterator ior2 = hs1.iterator(); ior2.hasNext();)//使用 for 迴圈
  34:          {
  35:              Integer ger = (Integer)ior2.next();//記得轉型
  36:              System.out.println(ger);//1 2
  37:          }
  38:          
  39:          /**LinkHashSet使用,元素不可重複,有順序性*/
  40:          LinkedHashSet lhs = new LinkedHashSet();
  41:          lhs.add(5.1);
  42:          lhs.add(3.1);
  43:          lhs.add(4.1);
  44:          lhs.add(2.1);
  45:          lhs.add(0.1);
  46:          lhs.add(1.1);
  47:          lhs.add(1.1);//沒有放入linkedhashset,因為元素不得重複,不會造成錯誤
  48:          System.out.println(lhs.size());
  49:          System.out.println(lhs.isEmpty());
  50:          for(Iterator ior3 = lhs.iterator(); ior3.hasNext();)
  51:          {
  52:              Double temp1 = (Double)ior3.next();
  53:              System.out.println(temp1);// 5.1 3.1 4.1 2.1 0.1 1.1
  54:          }
  55:          
  56:          /**TreeSet使用,元素不可重複,會自動作排列(自然排序法)*/
  57:          TreeSet ts = new TreeSet();
  58:          ts.add(5);
  59:          ts.add(3);
  60:          ts.add(4);
  61:          ts.add(0);
  62:          ts.add(1);
  63:          ts.add(1);//沒有放入TreeSet,因為元素不得重複,不會造成錯誤
  64:          System.out.println(ts.size());
  65:          for(Iterator ior4 = ts.iterator();ior4.hasNext();)
  66:          {
  67:              Integer i = (Integer)ior4.next();
  68:              System.out.println(i);//0 1 3 4 5 自動作排列,字串會依字母順序排列
  69:          }
  70:          
  71:          /**AarrayList使用,元素可重複,可藉由索引來操作元素*/
  72:          ArrayList al = new ArrayList(); 
  73:          al.add("0");//加入元素
  74:          al.add("1");
  75:          al.add("2");
  76:          for(Object o : al)//使用 for-each顯示元素內容
  77:          {
  78:              System.out.println(o);//0 1 2
  79:          }
  80:          al.add(1, "3");//指定加入位置,之後的元素會自動往後移位
  81:          for(Object o : al)
  82:          {
  83:              System.out.println(o);//0 3 1 2
  84:          }
  85:          for(int i=0; i<al.size(); i++)
  86:          {
  87:              if(al.get(i).equals("3"))//指定條件搜尋
  88:              {
  89:                      al.remove(i);//移除
  90:              }
  91:          }
  92:          
  93:          /**Vector使用 ,功能類似於ArrayList,vector有 Thread-safe*/
  94:          Vector v1 = new Vector();
  95:          for(int i=0; i<5; i++)
  96:          {
  97:              v1.add(new TempClass(i));//加入自訂類別
  98:          }
  99:          
 100:          System.out.println(v1.size());
 101:          
 102:          for(int i=0; i<v1.size(); i++)
 103:          {
 104:              TempClass temptc = (TempClass)v1.get(i);
 105:              if(temptc.getNum()==3)
 106:              {
 107:                  v1.remove(i);//移除
 108:              }
 109:          }
 110:          
 111:          /**stack使用為後進先出,為vector的子類別*/
 112:          Stack sk = new Stack();
 113:          sk.push("abc");
 114:          sk.push("def");
 115:          sk.push("ghi");
 116:          for(int i=0;i<sk.size(); i++)
 117:          {
 118:              if(sk.get(i).equals("abc"))
 119:              {
 120:                  sk.pop();//由於後進先出, pop指令 會把 ghi 移出集合
 121:                  
 122:              }
 123:          }
 124:          for(int i=0; i<sk.size(); i++)
 125:          {
 126:              System.out.println(sk.get(i));//abc def
 127:          }
 128:          
 129:          for(int i=0;i<sk.size(); i++)
 130:          {
 131:              if(sk.get(i).equals("def"))
 132:              {
 133:                  sk.remove(i);//或者也可以使用 remove
 134:              }
 135:          }
 136:          for(int i=0; i<sk.size(); i++)
 137:          {
 138:              System.out.println(sk.get(i));//abc
 139:          }
 140:          
 141:          /**LinkedList使用,實作Queue*/
 142:          LinkedList ll = new LinkedList();
 143:          ll.add(9);
 144:          ll.add(7);
 145:          ll.add(4);
 146:          ll.add(5);
 147:          ll.add(8);
 148:          ll.poll();//移除索引最小的元素 9
 149:          ll.pollLast();//移除索引最大的元素 8
 150:          ll.addFirst(0);//從最小索引之前加入
 151:          ll.addLast(6);//從最大索引之後加入
 152:          for(int i=0; i<ll.size(); i++)
 153:          {
 154:              System.out.println(ll.get(i));//0 7 4 5 6
 155:          }
 156:          
 157:          /**HashMap使用,無順序性,無排序性*/
 158:          HashMap hm = new HashMap();
 159:          hm.put(0, 9);//使用 put(key,value) 放入元素
 160:          hm.put(0, 0);//由於put同一個key值,0會取代9
 161:          hm.put(1, 1);
 162:          hm.put(4, 4);
 163:          hm.put(2, 2);
 164:          hm.put(3, 3);
 165:          hm.put(5, 5);
 166:          System.out.println(hm.size());//6
 167:          System.out.println(hm.get(0));//0
 168:          System.out.println(hm.containsKey(100));//false 是否包含指定 key 值 
 169:          System.out.println(hm.containsValue(4));//true 是否包含指定 value 值
 170:          if(hm.containsKey(4))
 171:          {
 172:              hm.remove(4);
 173:          }
 174:          System.out.println(hm.size());//5
 175:          
 176:          
 177:          /**Hashtable使用,類似於HashSet,Hashtable有Thread-Safe*/
 178:          Hashtable ht = new Hashtable();
 179:          ht.put(0,0);
 180:          ht.put(1,1);
 181:          ht.put(2,2);
 182:          if(!ht.isEmpty())
 183:          {
 184:              ht.clear();
 185:          }
 186:          
 187:          /**LinkedHashMap使用,有順序性*/
 188:          LinkedHashMap lhm = new LinkedHashMap();
 189:          lhm.put("k1","v1");
 190:          lhm.put("k2","v2");
 191:          lhm.put("k3","v3");
 192:          System.out.println(lhm.containsKey(123));//false
 193:          System.out.println(lhm.containsValue("v3"));//true
 194:          
 195:          /**TreeMap使用,具有自動排序,限制元素類型相同*/
 196:          TreeMap tm = new TreeMap();
 197:          tm.put(0, "ghi");
 198:          tm.put(1, "def");
 199:          tm.put(2, "abc");
 200:          tm.put(3, "jkl");
 201:          System.out.println(tm.size());//4
 202:          System.out.println(tm.lastKey());//回傳最高鍵值
 203:          System.out.println(tm.firstKey());//回傳最低鍵值
 204:          System.out.println(tm.get(tm.lastKey()));//jkl
 205:          System.out.println(tm.get(tm.firstKey()));//ghi
 206:          
 207:          /**泛型和集合一起使用可限制元素的型別*/
 208:          Vector<String> v2 = new Vector<String>();//限制能放進 string
 209:  //        v2.add(3);錯誤不可放入非string
 210:          v2.add("rew");
 211:          
 212:          
 213:      }
 214:   
 215:  }
 216:   
 217:  class TempClass
 218:  {
 219:      private int tempNum;
 220:      
 221:      TempClass()
 222:      {
 223:          tempNum = 99;
 224:      }
 225:      
 226:      TempClass(int temp)
 227:      {
 228:          tempNum = temp;
 229:      }
 230:      
 231:      public int getNum()
 232:      {
 233:          return tempNum;
 234:      }
 235:      
 236:  }