------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
Map 接口
Map 接口定義的集合,又稱查找表
Map 接口和 Collection 接口沒關係
Map 集合派系,存儲映射鍵值對
不允許重複的鍵,每個鍵最多映射 1 個值
根據內部數據結構不同,Map 接口有多種實現類:
常用的有內部爲 hash 表實現的 HashMap 和內部爲排序二叉樹實現的 TreeMap
Map 接口和 Collection 接口的不同
Map 和 Collection 是獨立的接口
Map 雙列,存儲鍵值對映射關係,鍵具有唯一性,每個鍵只能映射 1 個值
Collection 單列,存儲對象的引用,其 Set 子接口的元素是唯一的
Map 的數據結構只針對鍵有效,跟值無關;Collection 的數據結構針對元素有效
Map 接口成員方法
V put(K key, V value)
// 將鍵值對存儲到集合,返回值一般是 null,存儲重複鍵返回被替換之前的值
V get(Object key) // 根據鍵獲取值,如果不存在返回 null
V remove(Object key) // 移除指定鍵的映射關係,返回該鍵對應的值
void clear() // 清空集合
boolean containsKey(Object key) // 判斷是否包含指定鍵的映射關係
boolean containsValue(Object value) // 判斷是否包含指定值
boolean isEmpty() // 判斷是否爲空
int size() // 返回集合大小
Set<K> keySet() // 將 Map 集合中所有的鍵,存儲到 Set 集合
Collection<V> values() // 將 Map 集合中的所有值,存儲到 Collection 集合
Set<Map.Entry<K, V>> entrySet() // 將所有鍵值對存儲到集合
Map 集合遍歷
第一種方式 Set<K> keySet():適合開發使用,簡單、代碼量少
Map 接口中定義的方法keySet,將 Map 集合中所有的鍵存儲到 Set 集合,迭代 Set 集合,獲取出 Set 集合中存儲的元素就是 Map 中的鍵,get() 根據鍵獲取值。
1. 調用 Map 集合方法 keySet,將所有鍵存儲到集合
2. 迭代 Set 集合,獲取 Set 集合存儲的對象
3. Map 集合方法 get,傳遞鍵獲取值
Set<String>set= map.keySet();
Iterator<String>iterator= set.iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
Integer value = map.get(key);
System.out.println("value= " + value);
}
第二種方式Set<Map.Entry<K, V>> entrySet():適合面試考試
原理:存儲鍵值對,鍵值對的映射關係也是一個對象,對象的描述是接口,是 Map 接口的內部接口 Entry 。Map 集合中,實現了這個內部接口 Entry,重寫接口中的方法,可以讓我們獲取 Map 集合中的鍵值對。
Entry 的方法:K getKey(), V getValue()
1. 調用 Map 集合方法 entrySet,將所有鍵值對映射關係對象(即 Map.Entry 接口的實現類對象)存儲到 Set 集合
2. 迭代 Set 集合,獲取 Set 集合存儲的對象(Map.Entry 接口的實現類對象)
3. 調用 Map.Entry 接口的方法 getKey, getValue 分別獲取鍵和值
Set<Map.Entry<String,Integer>> set2= map.entrySet();
Iterator<Map.Entry<String,Integer>> iterator2= set2.iterator();
while (iterator2.hasNext()) {
Map.Entry<String, Integer> entry = (Map.Entry<String,Integer>) iterator2.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("key= " + key + ", value= "+ value);
}
增強 for 循環遍歷示例
package cn.itcast;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/*
* Map 接口和Iterable 沒有關係不具有獲取迭代器方法,
* 增強for不能直接遍歷Map集合
* 但是可以間接遍歷(遍歷的是Set)
*/
public class MapForEach {
publicstatic void main(String[] args) {
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("a",1);
map.put("b",2);
map.put("c",3);
Set<String>set = map.keySet();
for(String key : set) {
Integervalue = map.get(key);
System.out.println("value=" + value);
}
System.out.println("-------------------");
Set<Map.Entry<String,Integer>> set2 = map.entrySet();
for(Entry<String, Integer> entry : set2) {
Stringkey = entry.getKey();
Integervalue = entry.getValue();
System.out.println("key=" + key + ", value= " + value);
}
}
}
HashMap 類
底層數據結構,鍵是哈希表結構,保證鍵的唯一性
(存儲自定義對象的鍵,需要重寫 hashCode equals 方法)
允許存儲 null 鍵值
存儲速度快,線程不安全集合,運行速度快
LinkedHashMap 類繼承 HashMap
基於鏈表和哈希表的實現,線程不安全集合
維護着一個雙向循環鏈表,此鏈表定義了迭代順序,通常是存放元素的順序
有序 Map 集合,存儲取出的順序一致,具有可預知的迭代順序
TreeMap 類
底層數據結構是紅黑樹(保證鍵的排序和唯一性)
對存儲的鍵進行排序,自然排序和比較器排序
線程不安全集合運行速度快
獲取字符串中每個字母出現的次數
package cn.itcast;
import java.util.TreeMap;
/*
* 統計字符串中每個字母出現的次數
*
* 思路:
* 將字符串轉成字符數組,遍歷字符數組,
* 將每個字母及其出現的次數存進 Map 集合
* 遍歷存儲集合完成後,取出集合中的鍵值
*/
publicclassTreeMapTest {
publicstaticvoid main(String[] args) {
Stringstring= "wwwitcastcn";
// Map 集合存儲字母及其出現的次數
TreeMap<Character,Integer> map= newTreeMap<Character, Integer>();
char[] arr = string.toCharArray();
for (charc : arr) {
// 獲取字母已出現的次數並根據當前迭代情況修改
Integervalue= map.get(c);
if (value == null) {
map.put(c, 1);
}else{
map.put(c, ++value);
}
}
// 遍歷集合中存儲的鍵(即每個字母),獲取相應的值(即字母出現的次數)
for (charkey : map.keySet()) {
Integervalue= map.get(key);
System.out.println(key + "(" + value + ")");
}
}
}
Hashtable 集合自身特性
底層數據結構是哈希表,保證鍵的唯一性
不允許存儲 null 鍵值
線程安全集合,運行速度慢
Properties 類繼承 Hashtable
底層數據結構是哈希表,線程安全集合
可以和IO流結合使用,實現數據持久性存儲
存儲和取出的代碼和HashMap 完全一樣
爲什麼沒有泛型?固定集合存儲的類型,屬性列表中每個鍵、值都是字符串
setProperty(String key, String value) // 將鍵值對存儲到集合
String getProperty(String key) // 根據鍵獲取值
HashMap 和 Hashtable 的區別
二者都實現了 Map 接口,是將唯一鍵映射到特定的值上
HashMap:
線程不安全,運行速度快
沒有排序,可以存儲 null 鍵和多個 null 值
Hashtable:
線程安全,運行速度慢
不可以存儲 null 鍵值
List, Set, Map 等接口是否都繼承自 Collection 接口
List 和 Set 繼承自 Collection接口,而 Map 不繼承任何接口
java.util.Collections 類,集合操作的工具類
// 對集合中的元素進行自然順序排序
//對自定義對象排序需要在類中實現 Coparable 接口並重寫 compareTo 方法
Collections.sort(list);
// 返回一個比較器對象,逆轉對象的自然順序
Comparator<String>comparator= Collections.reverseOrder();
Collections.sort(list, comparator);
// 對集合中的元素的順序進行反轉
Collections.reverse(list);
// 二分法查找在集合中指定元素返回索引值
intindex = Collections.binarySearch(list, "itcast");
// 對集合中的元素隨機排列
Collections.shuffle(list);
Sting[] <-->List
String[] strArr = {"www", ".itcat",".cn"};
List<String> list = Arrays.asList(strArr); // fixed-sizelist
for(String string : list) {
System.out.print(string + " "); // www .itcast .cn
}
// list.add(""); // UnsupportedOperationException
// java.util.Arrays$ArrayList
System.out.println(list.getClass().getName());
list.set(0, "3w"); // 可以修改元素
// 如果想要添加元素,可以用如下方式:
List<String> list1 = new ArrayList<String>();
list1.addAll(list);
System.out.println(list1); // [www, .itcast, .cn]
list1.add("0807JavaSE");
System.out.println(list1); // [www, .itcast, .cn, 0807JavaSE]