## 一、Map 集合
不屬于Collection集合的子集合
Map<key ,value>
## 二、Map集合的特點:
1. 可以有null,只能有一個
2. 以鍵值對的形式,存儲元素
3. Map集合中的元素, key是不允許重復的,value是可以重復的
4. Map集合中的元素, key和value是一一對應
## 三、Map的實現類:
#### HashMap
底層是用`哈希表`實現的,查詢的速度特別的快
`HashMap`集合是一個無序的集合,存儲元素和取出元素的順序有可能不一致
#### TreeMap
底層是用`二叉樹`實現的
### `HashMap` 類與 `Hashtable` 的區別?
> `HashMap` :線程不同步,不允許null鍵和null值
>
> `Hashtable`: 線程同步,允許null鍵和null值
> Map集合沒有迭代器,要想遍歷集合中的內容,必須把其轉為set集合進行
## 四、Map集合常用的方法:
| put(); | |
| :---------: | :--------------------------------------------- |
| get(); | key存在,返回對應的value值;key不存在,返回null |
| remove(); | key存在,v返回被刪除的值;key不存在,v返回null |
| entrySet(); | 返回map集合的鍵值對set集合,常用 |
| keySet(); | 返回ma集合中所有key的set集合,不常用 |
| values(); | 返回map集合中所有value的collection集合,不常用 |
## 五、Map 的練習:
```java
public class MapDemo {
/**
* put
*/
@Test
public void test1() {
Map<String, Integer> a = new HashMap<>();
a.put("語文", 99);
a.put("數學", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a);
}
/**
* get(); 根據key值獲取value值
*/
@Test
public void test2() {
Map<String, Integer> a = new HashMap<>();
a.put("語文", 99);
a.put("數學", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a);
System.out.println(a.get("數學"));
}
/**
* remove
*/
@Test
public void test3() {
Map<String, Integer> a = new HashMap<>();
a.put("語文", 99);
a.put("數學", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a.remove("數學"));
System.out.println(a);
}
/**
* Map集合的三種collection視圖
*/
@Test
public void test4() {
Map<String, Integer> a = new HashMap<>();
a.put("語文", 99);
a.put("數學", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a);
// key - value視圖
Set<Map.Entry<String,Integer>> s=a.entrySet();
System.out.println(s);
// key 視圖
Set keys= a.keySet();
System.out.println(keys);
// value 視圖
Collection c=a.values();
System.out.println(c);
}
}
```
## 六、Map 集合遍歷鍵找值方法:
### 1、鍵找值方式:
**即通過元素中的鍵,獲取鍵所對應的值**
```Set<K> keySet() 返回此映射中包含的鍵的 Set 視圖。```
### 實現步驟:
1. 使用Map集合中的方法keySet(),把Map集合所有的key取出來,存儲到一個Set集合中
1. 遍歷set集合,獲取Map集合中的每一個key
2. 通過Map集合中的方法get(key),通過key找到value
```java
public static void main(String[] args) {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
//1.使用Map集合中的方法keySet(),把Map集合所有的key取出來,存儲到一個Set集合中
Set<String> set = map.keySet();
//2.遍歷set集合,獲取Map集合中的每一個key
//使用迭代器遍歷Set集合
Iterator<String> it = set.iterator();
while (it.hasNext()){
String key = it.next();
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("-------------------");
//使用增強for遍歷Set集合
for(String key : set){
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("-------------------");
//使用增強for遍歷Set集合
for(String key : map.keySet()){
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
```
------------
### 2、使用Entry對象遍歷:
```Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射關系的 Set 視圖。```
### 實現步驟:
1. 使用Map集合中的方法entrySet(),把Map集合中多個Entry對象取出來,存儲到一個Set集合中
2. 遍歷Set集合,獲取每一個Entry對象
3. 使用Entry對象中的方法getKey()和getValue()獲取鍵與值
```java
public static void main(String[] args) {
//創建Map集合對象
Map<String,Integer> map = new HashMap<>();
map.put("趙麗穎",168);
map.put("楊穎",165);
map.put("林志玲",178);
//1.使用Map集合中的方法entrySet(),把Map集合中多個Entry對象取出來,存儲到一個Set集合中
Set<Map.Entry<String, Integer>> set = map.entrySet();
//2.遍歷Set集合,獲取每一個Entry對象
//使用迭代器遍歷Set集合
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while(it.hasNext()){
Map.Entry<String, Integer> entry = it.next();
//3.使用Entry對象中的方法getKey()和getValue()獲取鍵與值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
System.out.println("-----------------------");
for(Map.Entry<String,Integer> entry:set){
//3.使用Entry對象中的方法getKey()和getValue()獲取鍵與值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
}
```
## List集合、Set集合、Map集合之間的區別?
1. ```List``` 和 ```Set``` 是存儲單列數據的集合,```Map``` 是存儲鍵值對這樣的雙列數據的集合;
2.
? 1) ```List``` 中存儲的數據是有順序的,并且值允許重復;
? 2) ```Map``` 中存儲的數據是無序的,它的鍵是不允許重復的,但是值是允許重復的;
? 3) ```Set```中存儲的數據是無順序的,并且不允許重復,但元素在集合中的位置是由元素的```hashcode```決定,即位置是固定的
? (Set集合是根據hashcode來進行數據存儲的,所以位置是固定的,但是這個位置不是用戶可以控制的,所以對于用戶來說set中的元素還是無序的)。
```
1. List 集合中對象按照索引位置排序,可以有重復對象,允許按照對象在集合中的索引位置檢索對象,例如通過list.get(i)方法來獲取集合中的元素;
2. Map 中的每一個元素包含一個鍵和一個值,成對出現,鍵對象不可以重復,值對象可以重復;
3. Set 集合中的對象不按照特定的方式排序,并且沒有重復對象,但它的實現類能對集合中的對象按照特定的方式排序,例如 Tree Set 類,可以按照默認順序,也可以通過實現 Java.util.Comparator< Type >接口來自定義排序方式。
```

- JAVA筆記
- 01、Java掃盲
- 1、JVM、JRE和JDK的區別
- 2、環境變量path和classpath的作用是什么?
- 3、變量有什么用?為什么要定義變量?什么時候用?
- 4、&和&&的區別?
- 5、標示符命名規則
- 6、數據類型
- 7、類型轉換
- 8、java語言的三種技術架構
- 9、java的跨平臺性
- 10、有符號數據的表示法(次重點)
- 11、按位運算符
- 12、函數
- 13、重載
- 14、數組
- 15、內存結構
- 一、數據結構
- 隨機數
- 流程控制語句
- if 和 if...else
- switch
- for
- 函數
- 重載
- 數組
- 數組的復制
- 冒泡排序法算法
- 方法
- 方法的重載
- 方法的練習
- 面向對象
- 面向對象的特點
- 如何創建類
- 如何創建對象
- 一、引用數據類型具有的默認值
- 二、成員變量和局部變量
- 三、構造函數
- 四、氣球理論
- 五、繼承(extends)
- 權限修飾符
- 封裝
- 內存的分配
- 多態
- super關鍵字
- static關鍵字
- final關鍵字
- 抽象類 抽象方法(abstract)
- 接口(interface)
- 單例模式(singleton)
- Object類
- 內部類
- 匿名內部類
- 階段項目
- 捕魚達人
- 飛機大戰
- 護盾功能
- 血條
- 爆炸
- API
- String 類相關的方法
- 第三方(Apache)jar包的使用
- 正則表達式
- StringBuffer 和StringBuilder 和Date
- 核心API:集合類
- List 集合
- 遍歷集合的方式
- 包裝類
- Map 集合
- 異常