---
# System prepended metadata

title: java假日班-0306-Collectiond-Map
tags: [Tibame-java入門班]

---

###### 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)

