# HashMap TreeMap LinkedHashMap
> HashMap的構造方法 . 合適的遍歷 . 復制轉換
> HashMap的底層原理
> HashMap, TreeMap, LinkedHashMap 對比
## 1. 通用方法 :
```
put(key, value):存入Map中一個key/value映射
get(Object key):返回指定鍵所映射的值
remove(Object key):從該Map中刪除一個鍵的映射
containsKey(Object key):是否包含指定的key
testMap.getOrDefault(key, 0));
```
```
Map userMap = new HashMap<>();
userMap.put(122, "a");
userMap.get(122);
userMap.getOrDefault(122, "");
userMap.remove(122);
userMap.containsKey(122);
```
## 2. HashMap的構造方法 :
```
HashMap()
hashMap(int initialCapacity) 指名初始化大小
hashMap(int initialCapacity, float loadFactor) 參數因子:指明在什么情況下會進行擴容
```
## 3. HashMap的Entry結構 :
```
static class Entry<K, V> implements Map.Entry<K, V> {
final K key;
V value;
Entry<K, V> next;
final int hash;
}
```
## 4. Map的4種遍歷方式:
注: Map的打印輸出不是按照key的固定順序輸出的.
### 1. 利用keySet進行遍歷 (速度最慢)
```
for (Integer key : userMap.keySet()) {
System.out.println(key + "***" + userMap.get(key));
}
```
### 2. 利用values進行遍歷 (性能最好)
```
for (String v : userMap.values()) {
System.out.println(v);
}
```
### 3.利用entrySet進行遍歷 (速度均衡)
```
for (Map.Entry entry:userMap.entrySet()) {
System.out.println(entry.getKey() + "+++" + entry.getValue());
}
```
### 4.利用Iterator迭代器進行遍歷 (性能第2)
```
Iterator<Map.Entry<Integer, String> it = userMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = it.next();
System.out.println(entry.getKey() + "+++" + entry.getValue());
}
```
### 5. 性能分析
```
public static Map intputMat() {
Map userMap = new HashMap<>();
String[] str = new String[]{"a","b","b","d","e","f","g","h","m","n"};
String key;
int value;
for (int i = 0; i <= 100000; i++) {
int m = (int)(Math.random()*10);
key = str[m] + i * 100;
value = i;
userMap.put(key, value);
}
return userMap;
}
```
結論 : values 和 Iterator 最快. keySet 最慢.