[TOC]
# 簡介
我們通過查看Map接口描述,發現Map接口下的集合與Collection接口下的集合,它們存儲數據的形式不同。
* Collection中的集合,元素是孤立存在的(理解為單身),向集合中存儲元素采用一個個元素的方式存儲。
* Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。
* Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
* 需要注意的是,Map中的集合不能包含重復的鍵,值可以重復;每個鍵只能對應一個值。
* Map中常用的集合為HashMap集合、LinkedHashMap集合
通過查看Map接口描述,看到Map有多個子類,這里我們主要講解常用的HashMap集合、LinkedHashMap集合。
* HashMap<K,V>:存儲數據采用的哈希表結構,元素的存取順序不能保證一致。由于要保證鍵的唯一、不重復,需要重寫鍵的hashCode()方法、equals()方法。
* LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,存儲數據采用的哈希表結構+鏈表結構。通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重復,需要重寫鍵的hashCode()方法、equals()方法。
* 注意:Map接口中的集合都有兩個泛型變量<K,V>,在使用時,要為兩個泛型變量賦予數據類型。兩個泛型變量<K,V>的數據類型可以相同,也可以不同
## Map接口中的常用方法

* put方法:將指定的鍵與值對應起來,并添加到集合中
- 方法返回值為鍵所對應的值
使用put方法時,若指定的鍵(key)在集合中沒有,則沒有這個鍵對應的值,返回null,并把指定的鍵值添加到集合中;
使用put方法時,若指定的鍵(key)在集合中存在,則返回值為集合中鍵對應的值(該值為替換前的值),并把指定鍵所對應的值,替換成指定的新值。
* get方法:獲取指定鍵(key)所對應的值(value)
* remove方法:根據指定的鍵(key)刪除元素,返回被刪除元素的值(value)。
演示
~~~
//創建Map對象
Map<String, String> map = new HashMap<String,String>();
//給map中添加元素
map.put("星期一", "Monday");
map.put("星期日", "Sunday");
System.out.println(map); // {星期日=Sunday, 星期一=Monday}
//當給Map中添加元素,會返回key對應的原來的value值,若key沒有對應的值,返回null
System.out.println(map.put("星期一", "Mon")); // Monday
System.out.println(map); // {星期日=Sunday, 星期一=Mon}
//根據指定的key獲取對應的value
String en = map.get("星期日");
System.out.println(en); // Sunday
//根據key刪除元素,會返回key對應的value值
String value = map.remove("星期日");
System.out.println(value); // Sunday
System.out.println(map); // {星期一=Mon}
~~~
## Map集合遍歷
鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值
操作步驟與圖解:
1. 獲取Map集合中所有的鍵,由于鍵是唯一的,所以返回一個Set集合存儲所有的鍵

2. 遍歷鍵的Set集合,得到每一個鍵
3. 根據鍵,獲取鍵所對應的值

演示
~~~
//創建Map對象
Map<String, String> map = new HashMap<String,String>();
//給map中添加元素
map.put("鄧超", "孫儷");
map.put("李晨", "范冰冰");
map.put("劉德華", "柳巖");
//獲取Map中的所有key
Set<String> keySet = map.keySet();
//遍歷存放所有key的Set集合
Iterator<String> it =keySet.iterator();
while(it.hasNext()){
//得到每一個key
String key = it.next();
//通過key獲取對應的value
String value = map.get(key);
System.out.println(key+"="+value);
}
~~~
## Entry鍵值對對象
在Map類設計時,提供了一個嵌套接口:Entry。Entry將鍵值對的對應關系封裝成了對象。即鍵值對對象,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)對象中獲取對應的鍵與對應的值。

* Entry是Map接口中提供的一個靜態內部嵌套接口

* getKey()方法:獲取Entry對象中的鍵
* getValue()方法:獲取Entry對象中的值

* entrySet()方法:用于返回Map集合中所有的鍵值對(Entry)對象,以Set集合形式返回。
### 遍歷
~~~
//創建Map對象
Map<String, String> map = new HashMap<String,String>();
//給map中添加元素
map.put("鄧超", "孫儷");
map.put("李晨", "范冰冰");
map.put("劉德華", "柳巖");
//獲取Map中的所有key與value的對應關系
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍歷Set集合
Iterator<Map.Entry<String,String>> it =entrySet.iterator();
while(it.hasNext()){
//得到每一對對應關系
Map.Entry<String,String> entry = it.next();
//通過每一對對應關系獲取對應的key
String key = entry.getKey();
//通過每一對對應關系獲取對應的value
String value = entry.getValue();
System.out.println(key+"="+value);
}
~~~
注意:Map集合不能直接使用迭代器或者foreach進行遍歷。但是轉成Set之后就可以使用了。
# 靜態導入
在導包的過程中我們可以直接導入靜態部分,這樣某個類的靜態成員就可以直接使用了。在源碼中經常會出現靜態導入。
靜態導入格式:
import static XXX.YYY; 導入后YYY可直接使用。
例如:Map.Entry的訪問,簡化后為Entry
~~~
import static java.util.Map.Entry;
public class HashMapTest {
public static void main(String[] args) {
//1,創建hashmap集合對象。
Map<Student,String> map = new HashMap<Student,String>();
//取出元素。鍵值對方式
//Set<Map.Entry<Student, String>> entrySet = map.entrySet();
Set<Entry<Student, String>> entrySet = map.entrySet();
//for (Map.Entry<Student, String> entry : entrySet) {
for (Entry<Student, String> entry : entrySet) {
Student key = entry.getKey();
String value = entry.getValue();
System.out.println(key.toString()+"....."+value);
}
}
}
~~~
# 可變參數
在JDK1.5之后,如果我們定義一個方法需要接受多個參數,并且多個參數類型一致,我們可以對其簡化成如下格式:
~~~
修飾符 返回值類型 方法名(參數類型... 形參名){ }
~~~
其實這個書寫完全等價與
~~~
修飾符 返回值類型 方法名(參數類型[] 形參名){ }
~~~
只是后面這種定義,在調用時必須傳遞數組,而前者可以直接傳遞數據即可。
~~~
jdk1.5以后。出現了簡化操作。... 用在參數上,稱之為可變參數。
~~~
同樣是代表數組,但是在調用這個帶有可變參數的方法時,不用創建數組(這就是簡單之處),直接將數組中的元素作為實際參數進行傳遞,其實編譯成的class文件,將這些元素先封裝到一個數組中,在進行傳遞。這些動作都在編譯.class文件時,自動完成了。
add方法在同一個類中,只能存在一個。因為會發生調用的不確定性
注意:如果在方法書寫時,這個方法擁有多參數,參數中包含可變參數,可變參數一定要寫在參數列表的末尾位置。
# Collections集合工具類
Collections是集合工具類,用來對集合進行操作。部分方法如下

* public static <T> void sort(List<T> list) // 集合元素排序
~~~
//排序前元素list集合元素 [33,11,77,55]
Collections.sort( list );
//排序后元素list集合元素 [11,33,55,77]
~~~
* public static void shuffle(List<?> list) // 集合元素存儲位置打亂
~~~
//list集合元素 [11,33,55,77]
Collections.shuffle( list );
//使用shuffle方法后,集合中的元素為[77,33,11,55],每次執行該方法,集合中存儲的元素位置都會隨機打亂
~~~
# 集合繼承體系的面向對象思想

- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化