# Java Collection 容器
> AndyLee 2017.5.4
---
![](https://i.imgur.com/Uu9Fa0Z.png)
## 1.Collection
### Set
在集合中的元素**沒有特定的順序,但是元素不能重複出現(是唯一的)**
#### HashSet
- 利用雜湊表(hash table)演算法改進執行的效率
- 實作的方式,是利用 hash code 產生並規劃出多個 hashcan,也可以根據 hash code 快速的找到特定的 object
- 若要判斷 HashSet 中的兩個 object 是否相同,除了使用 hashCode() method 來確定傳回值是否相同,還要使用 equals() method 來比較兩 object 是否相同。
- HashSet物件裡的元素都是唯一存在的
- 宣告一個泛型型態為Integer的HashSet類別之物件hashset
:::warning
Hashset<Integer> set = new Hashset<Integer>();
:::
```clike=
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class test
{
public static void main(String \[\] argv)
{
Set<String> set = new HashSet<String>();
set.add("張三");
set.add("王五");
set.add("李四");
set.add("張三");
for(int i : set){
System.out.print(i+", ");
}
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
}
}
```
- hashset相關methods
https://www.tutorialspoint.com/java/util/java_util_hashset.htm
#### TreeSet
- SortedSet 提供相關的方法讓您有序的取出對應位置的物件,像是 first()、last() 等方法
- 它使用**紅黑樹結構**來對加入的物件進行排序
- 依**字典順序**來排列 String 物件是 TreeSet 預設的
:::warning
Set<String> set = new TreeSet<String>();
:::
---
### List
- List 資料結構的特性是,每個加入 List 中的元素是**循序加入的,並可指定索引來存取元素**
- List 容器中的物件允許重複
- List 可以使用陣列(Array)或是鏈結串列(Linked List)來實作這個特性,前者在 Java SE 中的實作就是 java.util.ArrayList,後者就是 java.util.LinkedList
- 對於循序加入與存取,使用 ArrayList 的效率比較好,對於經常變動元素排列順序的需求,使用 LinkedList 會比較好。
#### List常用method:
增加
- add(index, element);
- addAll(index, Collection);
刪除
- remove(index);
修改
- set(index, element);
查詢
- get(index);
- subList(from, to);
- listIterator();
#### LinkedList
由於使用 LinkedList 使用鏈結串列,在進行插入與移除動作時有較好的效能,適合拿來實作堆疊(Stack)與佇列(Queue)。
LinkedList實做Stack
```javascript=
public class StringStack {
private LinkedList<String> linkedList;
public StringStack() {
linkedList = new LinkedList<String>();
}
public void push(String name) {
linkedList.addFirst(name);
}
public String top() {
return linkedList.getFirst();
}
public String pop() {
return linkedList.removeFirst();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
```
LinkedList實作
```javascript=
public class StringQueue {
private LinkedList<String> linkedList;
public StringQueue() {
linkedList = new LinkedList<String>();
}
public void put(String name) {
linkedList.addFirst(name);
}
public String get() {
return linkedList.removeLast();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
}
```
#### ArrayList
- add() 方法可以將一個物件加入 ArrayList中
- size() 方法可以傳回目前的 ArrayList 的長度
- get() 可以傳回指定索引處的物件
- toArray() 可以將 ArrayList 中的物件轉換為物件陣列
:::warning
List<String> list = new ArrayList<String>();
:::
```clike=
import java.util.ArrayList;
import java.util.Iterator;
public class test {
public static void main(String \[\] argv) {
ArrayList<String> list = new ArrayList<String>();
//新增
list.add("張三");
list.add("李四");
list.add("王五");
//list大小
System.out.println(list.size());
//取得陣列內容
System.out.println(list.get(0));
//查詢list內是否有該字串
System.out.println(list.contains("王五"));
//查詢元素位置
System.out.println(list.indexOf("王五"));
//刪除特定元素
list.remove("王五");
System.out.println(list.size());
//判斷list是否為空
System.out.println(list.isEmpty());
//建立Iterator,Iterator的是針對在不同的物件(陣列、鏈結、雜湊集合)的公開存取介面
//Iterator會先到物件內部收集資料再回傳到Iterator
Iterator it = list.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
}
}
```
:::info
在 J2SE 5.0 之後新增了泛型(Generic)的功能,使用物件容器時可以宣告將儲存的物件型態,如此您的物件在存入容器會被限定為您所宣告的型態,編譯器在編譯時期會協助您進行型態檢查,而取出物件時也不至於失去原來的型態資訊,這可以避免型態轉換時的問題
:::
---
## 2. Map
- 實作 java.util.Map 介面的物件會將「鍵」(Key)映射至「值」(Value),「值」指的是您要存入 Map 容器的物件。
- 在將物件存入 Map 物件時,需要同時給定一個「鍵」,要取回物件時可以指定鍵,如此就可以取得與鍵對應的物件「值」
- Map 中的**每一個Key都是唯一的**,不能有重複的鍵,Map擁有自己的排序機制。
### HashMap
:::warning
Map<String, String> map = new HashMap<String, String>();
:::
```javascript=
package net.twcic;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo2 {
public static void main(String args[]) {
Map<String, String> map = new HashMap<String, String>();
map.put("leon", "leon 的資料");
map.put("godleon", "godleon 的資料");
map.put("bill", "bill 的資料");
// 透過 values() 取得 Collection
// 再由 Collection 變出 Iterator
// 最後由 Iterator 列出所有元素
Collection collection = map.values();
Iterator iterator = collection.iterator();
while(iterator.hasNext())
System.out.println(iterator.next());
System.out.println();
// 透過 for each 也是可以的
for(String key : map.KeySet())
System.out.println(key+" : "+ map.get(key));
}
}
}
```
### TreeMap
- TreeMap 是 Java SE 中唯一實作 SortedMap 介面的類別,它使用**紅黑樹結構**來對加入的物件進行排序
:::info
Map<String,String> map = new TreeMap<String, String>();
:::
```javascript=
package net.twcic;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String args[]) {
Map<String, String> map = new TreeMap<String, String>();
map.put("godleon", "godleon 的資料");
map.put("leon", "leon 的資料");
map.put("bill", "bill 的資料");
for(String s : map.values())
System.out.println(s);
System.out.println();
}
}
```
---
## Reference:
1.http://mslab.csie.asia.edu.tw/~jackjow/courses/1001_WindowsProgram/ppt/16_Java%20collection.pdf
2.http://godleon.blogspot.tw/2007/07/container-container-list-set-map-key.html