Map
返回類型 | 方法 | 描述 |
---|---|---|
V | get(Object key) | 根據key取得value |
V | put(Obejct k,Object v) | 向Map中加入(替換)元素,返回之前的Value;之前沒有元素就返回null |
V | remove(Object key) | 根據key刪除元素,返回Value對應的value |
void | clear() | 清空 |
int | size() | 獲得集合的長度 |
boolean | isEmpty() | 判斷是否為空 |
boolean | containsKey(Object object) | 判斷指定的key是否存在 |
boolean | containsValue(Object value) | 判斷指定的value是否存在 |
Set | keySet() | 所有key的集合 |
Collection | values() | 所有value |
HashMap
存儲K-V,使用key來區分。
import java.util.*;
public class TestHashMap {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
// 新k返回null,舊k返回舊v
String put = map.put(1, "A");
System.out.println("之前沒有此K的V:" + put);
put = map.put(1, "B");
System.out.println("之前有同K的V:" + put);
System.out.println(map);
// get:有k返回v,無k返回null
String v = map.get(2);
System.out.println(v);
v = map.get(1);
System.out.println(v);
// containsKey/containsValue
boolean containsKey = map.containsKey(2);
boolean containsValue = map.containsValue("B");
// remove:刪k返回v;刪無可刪,返回null
String remove = map.remove(2);
System.out.println(remove);
remove = map.remove(1);
System.out.println(remove);
}
}
遍歷:
package ah;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class TestMap1Hash {
public static void main(String[] args) {
Map<String, String> _map = new HashMap<String, String>();
_map.put("1", "悟空");
_map.put(null, "白龍");
_map.put("2", "悟能");
_map.put("3", "悟凈");
System.out.println("------foreach語法遍歷map(輸出K-V)------");
for (String _key : _map.keySet()) {
System.out.print("key = " + _key);
System.out.println(" value = " + _map.get(_key));
}
System.out.println("------Java 8.forEach:Lambda------");
_map.forEach((k, v) -> System.out.println(k + ":" + v));
System.out.println("------使用迭代器迭代map(輸出V)------");
// 1.獲取值的Collection
Collection<String> _values = _map.values();
// 2.通過Collection獲得迭代器
Iterator<String> it = _values.iterator();
// 3.輸出值
while (it.hasNext()) {
String next = it.next();
System.out.println(next);
}
System.out.println("-----Map.Entry<K,V>-----");
// Map.Entry<K,V>是Map的內部接口,稱為映射項(鍵-值對)
Set<Entry<String, String>> entrySet = _map.entrySet();
System.out.println("=====Map.Entry<K,V>:for循環=====");
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
System.out.println("=====Map.Entry<K,V>:迭代器=====");
Iterator<Entry<String, String>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Entry<String, String> next = iterator.next();
System.out.println(next.getKey() + ":" + next.getValue());
}
}
}
LinkedHashMap
自帶鏈表(記錄元素順序),具有可預知的迭代順序。
Hashtable (不接受null)
Hashtable是一個比較老的類,甚至沒有遵循Java命名規范。盡量少用。
但是Hashtable有一個重要的子類——java.util.Properties。
public class Properties extends Hashtable<Object,Object> {...}
父以子貴,盡管Hashtable連命名都不規范,還是不會被淘汰。Properties類會在IO章節中介紹。
Hashtable是同步的,速度較慢。
兩個map使用上是基本一致,但是Hashtable限制性更強一些,K和V都不接受null——
- 不接受
- 不提示
- 運行時出錯
// X m.put(null, "NNN");
// X m.put("NNN", null);
HashMap對比Hashtable:
null鍵 | null值 | 重復鍵 | |
---|---|---|---|
HashMap | ● | ● | × |
Hashtable | × | × | × |
JAVA 9:of方法
List接口、Set接口、Map接口里增加靜態方法of,用於初始化集合。
集合元素個數不可變,添加新元素會拋出UnsupportedOperationException
of方法只適用於接口,不用於實現類。
Set、Map調用of方法時不能有重復的元素,如果重復會拋出IllegalArgumentException(不合法參數異常)
import java.util.*;
public class TestJ9of {
public static void main(String[] args) {
List<String> lst = List.of("a", "b");
// lst.add("c");//UnsupportedOperationException
System.out.println(lst);
// lang.IllegalArgumentException: duplicate element: a
Set<String> set = Set.of("a", "b");
// Set<String> set = Set.of("a", "b","a");
System.out.println(set);
Map<Integer, String> map = Map.of(1, "A", 2, "B");
System.out.println(map);
}
}