1.Map接口
Map接口定义了双例集合的存储特征,它并不是Collection接口的子接口。双例集合的存储特征是以key与value结构为单位进行存储。体现的是数学中的函数y=f(x)概念。
Map与Collection的区别
-
Collection中的容器,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储
-
Map中的容器,元素是成对存在的,每个元素由键与值两部分组成,通过键可以找到对应的值
-
Collection中的容器称为单列集合,Map中的容器称为双列集合
-
Map中的集合不能包含重复的键,值可以重复,每个键只能对应一个值
-
Map中常用的容器为HashMap,TreeMap
常用方法
方法 | 说明 |
---|---|
V put(K key,V value) | 把key与value添加到Map集合中,返回value |
void putAll(Map m) | 从指定Map中将所有映射关系复制到此Map中 |
V remove(Object key) | 删除key对应的value |
V get(Object key) | 根据指定的key,获取对应的value |
boolean containsKey(Object key) | 判断容器中是否包含指定的key |
boolean containsValue(Object value) | 判断容器中是否包含指定的value |
Set keySet() | 获取Map集合中所有的key,存储到Set集合中 |
Set<Map.Entry<K,V>> entrySet() | 返回一个Set基于Map.Entry类型包含Map中所有映射 |
void clear() | 删除Map中所有的映射 |
2.HashMap容器类
HashMap是Map接口的接口实现类,采用哈希算法实现,是Map接口最常用的实现类,由于底层采用了哈希表存储数据,所以要求键不能重复,如果发生重复,新的值会替换旧的值。HashMap在查找、删除、修改方面都有非常高的效率。
import java.util.*;
public class HashMapTest {
public static void main(String[] args) {
//实例化HashMap容器
Map<String,String> map = new HashMap<>();
//1.添加元素,put特点,遇到相同key的元素,会用新的覆盖旧的。
//返回值有覆盖的情况下,会将旧的value返回,否则为空
map.put("a", "A");
String value = map.put("a", "B");
System.out.println(value);
//2.获取元素 第一种方式,通过key获得,弊端:如果想获取Map中所有value,要知道所有key,太麻烦
//要多次调用才行,不好不好
System.out.println("----------------");
String val = map.get("a");
System.out.println(val);
//第二种方式,通过keySet配合get方法
//keySet将Map中所有的key组合成一个set的方式集合起来
System.out.println("----------------");
map.put("b", "B");
map.put("c", "C");
map.put("d", "D");
Set<String> keys = map.keySet();
for(String key:keys) {
String v1 = map.get(key);
System.out.println(key+"--"+v1);
}
//第三种方式,通过entrySet方法获取Map.Entry类型获取元素
System.out.println("----------------");
//Entry是一个内部接口,要通过外部接口.内部接口,把键值对打散放入Set中
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍历set
for(Map.Entry<String,String> entry:entrySet) {
String key = entry.getKey();
String v = entry.getValue();
System.out.println(key+"----"+v);
}
//3.Map容器的并集操作,泛型必须相同
System.out.println("----------------");
Map<String,String> map1 = new HashMap<>();
map1.put("f", "F");
//注意观察key为c的value值
map1.put("c", "cc");
map1.putAll(map);
Set<String> keys2 = map1.keySet();
//这里的结果是map1并map
for(String key:keys2) {
String v2= map1.get(key);
System.out.println(key+"--"+v2);
}
//4.Map容器删除元素
System.out.println("----------------");
String val1 = map.remove("d");
Set<String> set2 = map.keySet();
for(String key:set2) {
String v2 = map.get(key);
System.out.println(key+"-----"+v2);
}
//5.判断Key和value是否存在
System.out.println("----------------");
boolean flag1 = map.containsKey("aaaa");
System.out.println(flag1);
boolean flag2 = map.containsKey("a");
System.out.println(flag2);
boolean flag3 = map.containsValue("B");
System.out.println(flag3);
boolean flag4 = map.containsValue("BB");
System.out.println(flag4);
}
}
/*
A
----------------
B
----------------
a--B
b--B
c--C
d--D
----------------
a----B
b----B
c----C
d----D
----------------
a--B
b--B
c--C
d--D
f--F
----------------
a-----B
b-----B
c-----C
----------------
false
true
true
false
*/
3.HashMap底层实现
Java中HashMap的底层实现与源码分析_lipengfei0427的博客-CSDN博客
接上上一篇
4.TreeMap容器类
TreeMap和HashMap同样实现了Map接口,所以,对于API的用法来说是没有区别的,HashMap效率高于TreeMap,TreeMap是可以对键进行排序的一种容器,在需要对键排序时可选用TreeMap。TreeMap底层是基于红黑树实现的。
在使用TreeMap时需要给定排序规则:
-
元素自身实现比较规则
-
通过比较器实现比较规则
//自身实现比较规则,Users类上面的笔记有,翻一翻
import java.util.*;
public class TreeMapTest {
public static void main(String[] args) {
//实例化TreeMap
Map<Users,String> map = new TreeMap<>();
Users u1 = new Users("li1",3);
Users u2 = new Users("li2",4);
map.put(u1,"li1");
map.put(u2, "li2");
Set<Users> keys = map.keySet();
for(Users key:keys) {
System.out.println(key+"---"+map.get(key));
}
}
}
//通过比较器实现比较规则,Student类和StudentComparator比较器上面都有,翻一翻
import java.util.*;
public class TreeMapTest02 {
public static void main(String[] args) {
Map<Student,String> treemap = new TreeMap<>(new StudentComparator());
Student s1 = new Student("li1",18);
Student s2 = new Student("li2",22);
Student s3 = new Student("li1.5",22);
treemap.put(s1,"li1");
treemap.put(s2, "li2");
treemap.put(s3,"li1.5");
Set<Student> keys = treemap.keySet();
for(Student key:keys) {
System.out.println(key+"---"+treemap.get(key));
}
}
}