I know, i know
地球另一端有你陪我
一、 Map
图。不是 Collection 的子类
包括:
1、HashMap
┕ LinkedHashMap
2、TreeMap
二、特点
Map集合的特点:
1、将键映射到值的对象
2、一个映射不能包含重复的键
3、每个键最多可以映射到一个值
(即可以多对一,不可一对多)
映射 <K , V>
类似一一对应关系,一有夫妻对的叫法
举例:
<“剑帝” , “莱恩哈特”>
<“漆黑之牙” , “约修亚”>
<“歼灭天使” , “玲”>
泛型,即“参数化类型”。经数据的类型转为参数,转变为类似变量的存在
然后在调用时传入具体的类型(类型实参)
能够避免在在使用数据类型时犯错
三、HashMap
常用功能
1、增
V put(K key,V value)
将指定的值与该映射中的指定键相关联(可选操作)
举例:put(“漆黑之牙” , “约修亚”)
2、删
V remove(Object key)
如果存在(从可选的操作),从该地图中删除一个键的映射
举例:remove(“漆黑之牙”)
void clear()
从该地图中删除所有的映射(可选操作)
3、判断
boolean containsKey(Object key)
判断是否包含指定键
boolean containsValue(Object value)
判断是否包含指定值
boolean isEmpty()
判断图是否为空
4、长度
int size()
返回此地图中键值映射的数量
5、获取
Set<Map.Entry<K,V>> entrySet()
返回此Map中包含的映射的 Set 集
V get(Object key)
返回到指定键所映射的值,或null
Set keySet()
返回此图中包含的键的 Set集
Collection values()
返回此图中包含的值的 Collection 集合
HashMap<String, String> hm = new HashMap<String, String>();
//<“剑帝” , “莱恩哈特”>
//<“漆黑之牙” , “约修亚”>
//<“歼灭天使” , “玲”>
hm.put("剑帝","莱恩哈特");
hm.put("漆黑之牙","约修亚");
hm.put("歼灭天使","玲");
System.out.println(hm);
hm.remove("歼灭天使");
System.out.println(hm);
// hm.clear();
// System.out.println(hm.isEmpty());
// System.out.println(hm);
System.out.println(hm.containsKey("漆黑之牙"));
System.out.println(hm.containsValue("约修亚"));
System.out.println(hm.size());
String s = hm.get("漆黑之牙");
System.out.println(s);
Set<String> keys = hm.keySet();
System.out.println(keys);
Collection<String> values = hm.values();
System.out.println(values);
Set<Map.Entry<String, String>> mapSet = hm.entrySet();
System.out.println(mapSet);
6、遍历
根据键找值
1、获取Map集合中所有映射的键的Set集合
2、遍历键的集合,根据每一个键获取对应的值
Set<String> keys = hm.keySet();
System.out.println(keys);
for (String key : keys) {
System.out.println(key + "---" + hm.get(key));
}
// 剑帝---莱恩哈特
// 歼灭天使---玲
// 漆黑之牙---约修亚
根据键值对对象找键和值
1、获取所有的键值对的集合
2、遍历所有键值对的集合,得到每一个键值对对象
3、根据获取到的每一个键值对,来获取键和值
Set<Map.Entry<String, String>> mapSet = hm.entrySet();
System.out.println(mapSet);
for (Map.Entry<String, String> kv : mapSet) {
String key = kv.getKey();
System.out.println(kv.getKey() + "---" + kv.getValue());
}
引用类型遍历
for (Map.Entry<Pokemon2, String> kv2 : hm2Set) {
Pokemon2 key = kv2.getKey();
System.out.println(key.getName() + "---"
+ key.getLevel() + "---" + kv2.getValue());
}
四、LinkedHashMap
是实现了Map接口,底层是依赖于哈希表和链表的,具有可预知的遍历顺序
哈希表保证唯一性,保证的是Key的唯一性
链表保证有序,保证的是键的有序(存储和取出顺序一致)
java.util.LinkedHashMap<Integer, Pokemon2> lhm =
new java.util.LinkedHashMap<>();
Pokemon2 p1 = new Pokemon2("piplup",5);
Pokemon2 p2 = new Pokemon2("piplup",5);
Pokemon2 p3 = new Pokemon2("ralts",10);
Pokemon2 p4 = new Pokemon2("lapras",30);
Pokemon2 p5 = new Pokemon2("gardevoir",50);
Pokemon2 p6 = new Pokemon2("piplup",10);
lhm.put(1,p1);
lhm.put(2,p2);
lhm.put(3,p3);
lhm.put(4,p4);
lhm.put(5,p5);
lhm.put(6,p6);
Set<Map.Entry<Integer, Pokemon2>> lhmSet = lhm.entrySet();
for (Map.Entry<Integer, Pokemon2> kv : lhmSet) {
Pokemon2 value = kv.getValue();
System.out.println(kv.getKey() + "---"
+ value.getName() + "---" + value.getLevel());
}
}
// 1---piplup---5
// 2---piplup---5
// 3---ralts---10
// 4---lapras---30
// 5---gardevoir---50
// 6---piplup---10
五、TreeMap
底层是基于红黑树的Map接口的实现类
复杂引用类型,如自定义对象,需要实现接口 Comparable<> ,重写自然排序方法
根据 level 排序
TreeMap<Pokemon, Integer> tm = new TreeMap<>(new Comparator<Pokemon>() {
@Override
public int compare(Pokemon o1, Pokemon o2) {
int i = o1.getLevel() - o2.getLevel();
int i2 = (i==0 ? o1.getName().compareTo(o2.getName()) : i);
return i2;
}
});
Pokemon p1 = new Pokemon("piplup", 5);
Pokemon p2 = new Pokemon("ralts", 10);
Pokemon p3 = new Pokemon("gardevoir", 30);
Pokemon p4 = new Pokemon("pikachu", 15);
Pokemon p5 = new Pokemon("eevee", 15);
Pokemon p6 = new Pokemon("eevee", 15);
tm.put(p1,1);
tm.put(p2,2);
tm.put(p3,3);
tm.put(p4,4);
tm.put(p5,5);
tm.put(p6,6);
Set<Map.Entry<Pokemon, Integer>> entries = tm.entrySet();
for (Map.Entry<Pokemon, Integer> entry : entries) {
System.out.println(entry.getKey().getName()
+"---"+entry.getKey().getLevel());
}
// piplup---5
// ralts---10
// eevee---15
// pikachu---15
// gardevoir---30
写法大致相同
总结
图。不是 Collection 的子类
包括:
1、HashMap
┕ LinkedHashMap
2、TreeMap
元素为键值对 < k , v >
由于依赖哈希表,所以是无序的,除了有链表支撑的 LinkedHashMap