###### tags: `Tibame-java入門班` # java假日班-0306-Collectiond-Map vector類別 有五種寫法 ``` /** * Vector 為一可置入"任意物件"的"動態陣列"(可隨內含物多寡增減其長度) * Vector 提供同步化的優點(與負擔) , 這對多執行緒的存取是很重要的 */ import java.util.*; public class TestVector_Enumeration { public static void main(String args[]) { Vector list = new Vector(); list.add(new Integer(12)); list.add(new Long(34L)); list.add(new Float(5.6f)); list.add(new Double(7.8)); list.add(new String("Hello")); for (int i = 0; i < list.size(); i++) { Object obj = list.get(i); System.out.println(obj); } // JDK1.2後,Vector也可以用Iterator取值. // 因為List家族可以用Iterator或for迴圈取值 System.out.println(); Iterator it = list.iterator(); while (it.hasNext()) System.out.println(it.next()); System.out.println(); // ●或再利用JDK 1.5 的for-each取值 for (Object value : list) System.out.println(value); // 其它方法取值1 -> toArray() System.out.println(); Object a[] = list.toArray(); for (int i = 0; i < a.length; i++) System.out.println(a[i]); // JDK 1.0其它方法取值2 -> elements() // 只有 Vector 才有此method, 故呼叫此method時不能用多型的寫法 System.out.println(); Enumeration en = list.elements(); while (en.hasMoreElements()) System.out.println(en.nextElement()); } } ``` Hashtable類別 有五種取值方法 ``` /** 1.Hashtable 內部是一個"類似表格"的資料結構來儲存資料, 每一筆資料都有 對應的索引鍵(key) , 這索引鍵是物件的型態 , 但是通常為方便起見, 大 部份的情況都是利用"字串"值當做索引鍵(key). 反之當欲取出這筆資料時, 也是利用剛剛所設定的索引鍵值來取出資料 2.欲儲存不同的資料時必需用不同的索引鍵, 否則其索引鍵所對應資料值為最 後儲存的那筆資料 3.Hashtable 的資料也是物件的型態, 所以可以儲存任何形式的資料, 使用者 取出資料的同時, 必須注意該資料的型態而自行作物件資料轉換(casting)的動作. */ import java.util.*; public class TestHashtable_Enumeration { public static void main(String args[]) { Hashtable map = new Hashtable(); map.put("one", new Integer(1)); map.put("two", "2"); map.put("three", new Float(3.0)); Integer oneValue = (Integer) map.get("one"); String twoValue = (String) map.get("two"); Float threeValue = (Float) map.get("three"); System.out.println(oneValue); System.out.println(twoValue); System.out.println(threeValue); // 應測試改用keySet()的作法看看 // 取出所有的key(keyset),包裝為Set的型態 /** * keySet() 方法來自Map介面, 所以所有Map家族成員都適用此方式取值 , 因此Hashtable類別也當然適用 */ System.out.println(); Set keyset = map.keySet();// 取出所有的key(keyset),包裝為Set的型態 Iterator keys = keyset.iterator(); while (keys.hasNext()) System.out.println(map.get(keys.next())); // 應測試改用values()的作法看看 // 取出所有的value,包裝為Collection的型態 /** * values() 方法來自Map介面, 所以所有Map家族成員都適用此方式取值 , 因此Hashtable類別也當然適用 */ System.out.println(); Collection c = map.values();// 取出所有的value,包裝為Collection的型態 Iterator values = c.iterator(); // ●再利用Iterator介面取值 while (values.hasNext()) System.out.println(values.next()); System.out.println(); // ●或再利用JDK 1.5 的for-each取值 for (Object value : c) System.out.println(value); // JDK 1.0其它方法取值 -> elements() // 只有 Hashtable 才有此method, 故呼叫此method時不能用多型的寫法 System.out.println(); Enumeration vals = map.elements(); while (vals.hasMoreElements()) System.out.println(vals.nextElement()); // 取出所有的key -> keys() // 只有 Hashtable 才有此method, 故呼叫此method時不能用多型的寫法 System.out.println(); System.out.println("所有的keys如下:"); Enumeration ekeys = map.keys(); while (ekeys.hasMoreElements()) { System.out.println(ekeys.nextElement()); } } ``` Map介面(介面宣告) ![](https://i.imgur.com/hBmmEaF.png) P55 ![](https://i.imgur.com/eBCmS60.png) ![](https://i.imgur.com/yS17lHk.png) ![](https://i.imgur.com/7U1snix.png) 所有Map內的家族都可以使用Set ![](https://i.imgur.com/wDPyS5U.png) TreeMap依照Key的大小為排序。 ![](https://i.imgur.com/D6aIIDF.png) Hash>>亂,快 Linked>>依加入順序排序 Tree>>依大小排序(限制:需同類型、實作Comparable) →TreeMap用Key排大小 泛型 ![](https://i.imgur.com/qyNTQLM.png) 自訂泛型 ![](https://i.imgur.com/zuKOfB7.png) --- <<以下參考用>> ?的目的,在泛型內的指定類別內,使用所有型態就可以用<?>。 ![](https://i.imgur.com/1JrLr0q.png) ![](https://i.imgur.com/DriZYMt.png) 都是Number的子類別 ![](https://i.imgur.com/pJkuZyK.png) 使用<?>萬用字元的範例 ![](https://i.imgur.com/PTeikRC.png) ![](https://i.imgur.com/6z94OtY.png) 不使用?的方法。 ![](https://i.imgur.com/FoGl2mw.png) --- 自動裝箱/拆箱 ![](https://i.imgur.com/yPWYQ72.png) L1-P164頁有說明 現在寫法(精簡) ![](https://i.imgur.com/G3WBLrQ.png) 以前寫法(現在會跑出警告,但是還是能執行) ![](https://i.imgur.com/Bbl0E2K.png) 增強型For迴圈(for-each) (泛型跟For-Loop為絕配) Array ![](https://i.imgur.com/GIIKesx.png) Collection ![](https://i.imgur.com/Y1h2FRP.png) 增強型For迴圈無計次,也無法倒退。 無法取代傳統For迴圈 ![](https://i.imgur.com/iMT42ZS.png) for-each要反轉排序,需借外力。 ![](https://i.imgur.com/cGjVFKd.png) ``` import java.util.*; public class ForeachExample4_payAttation { public static void main(String[] args){ List<String> data = new ArrayList<String>(); data.add("吳永志1"); data.add("吳永志2"); data.add("吳永志3"); for(int i=data.size()-1; i>=0; i--) System.out.println(i+": "+data.get(i)); System.out.println(); Collections.reverse(data);//做反轉用 for(String str : data) //※以上我做不到 System.out.println(str); //※傳統for迴圈, 薑老的辣 } } ``` HashMap(亂排序) ![](https://i.imgur.com/Prcr3kD.png) TreeMap(大小排序) ![](https://i.imgur.com/KBLgOsN.png) ``` /* 底下是一個尋訪Map的所有value 的 Enhanced foreach 迴圈。 當然,因為用 HashMap,所以並沒有什麼順序(TreeMap,則有順序) */ import java.util.*; public class ForeachExample3_Map { public static void main(String[] args) { //Map<Integer , String> map = new HashMap<Integer , String>(); Map<Integer , String> map = new TreeMap<Integer , String>(); for (int i = 0; i < 6; i++) { map.put( i , "吳永志" + i ); } for (String val : map.values()) { System.out.println(val); } System.out.println("--------------------------------------------------"); Collection<String> c = map.values();//泛型標準寫法 for (String val : c { System.out.println(val); } System.out.println("--------------------------------------------------"); Set<Integer> s = map.keySet();//泛型標準寫法 for (Integer mykey : s) { System.out.println(mykey);//取KEY } System.out.println("--------------------------------------------------"); for (Integer mykey : s) { System.out.println(mykey+"="+map.get(mykey));//取KEY與值 } System.out.println("--------------------------------------------------"); //toString應用 System.out.println(map); } } /*HashMap 輸出結果: 吳永志2 吳永志4 吳永志1 吳永志3 吳永志5 吳永志0 */ /*HTreeMap 輸出結果: 吳永志0 吳永志1 吳永志2 吳永志3 吳永志4 吳永志5 */ ``` ![](https://i.imgur.com/b3KZuUQ.png) ![](https://i.imgur.com/5e7yMeN.png) ![](https://i.imgur.com/2ZigjBn.png) 可傳入動態參數 ![](https://i.imgur.com/2cNGzPf.png) 用contains判斷單個,containsAll判斷是否全部含有 ![](https://i.imgur.com/Fv3wnJk.png) remove,removeall(移除) ![](https://i.imgur.com/7dNOBco.png) --- ![](https://i.imgur.com/4f0KP8p.png) IO-創建資料夾 (左邊放目錄,右邊放檔案) ![](https://i.imgur.com/RZ6T44B.png) 最後顯現出答案是最後的名稱 ![](https://i.imgur.com/f97Yjyh.png) ![](https://i.imgur.com/bHHpFig.png) ![](https://i.imgur.com/WwNKMWz.png) 無指名哪個地方,會在當前目錄找 ![](https://i.imgur.com/YQ8WUXz.png) ![](https://i.imgur.com/JSPfMNj.png) 執行前 ![](https://i.imgur.com/IyomyLi.png) 執行後 ![](https://i.imgur.com/My5qiRI.png) 執行前 ![](https://i.imgur.com/mopmk1k.png) 執行後 ![](https://i.imgur.com/McAxSw4.png) ![](https://i.imgur.com/wDgSzbX.png)