一、Map集合的概述
1、Map集合概述和使用
- Map集合是一种双列集合,每个元素包含两个数据
- Map集合的每个元素的格式:key=value(键值对元素)
- Map集合也被称为“键值对集合”
2、Map集合整体格式
- Collection集合的格式:[元素1,元素2,元素3..]
- Map集合的完整格式:[key1=value1, key2=value2, key3=value3,..]
二、Map集合体系特点
1、Map集合体系
2、Map类集合体系特点
- Map集合的特点都是由键决定的。
- Map集合的键都是无序,不重复的,无索引的,值不做要求(可以重复)。
- Map集合后面重复的键对应的值会覆盖前面重复键的值。
- Map集合的键值对都可以为null。
3、Map集合实现类特点
- HashMap:元素按照键是无序,不重复,无索引,值不做要求(与Map体系一致)
- LinkedHashMap:元素按照键是有序,不重复,无索引,不做要求。
- TreeMap:元素按照键是排序,不重复,无所引导的,值不做要求。
Map<String, Integer> maps = new LinkedHashMap<>();
maps.put("a", 3);
maps.put("b", 1);
maps.put("c", 100);
maps.put("b", 100);
maps.put(null, null);
System.out.println(maps);//{a=3, b=100, c=100, null=null}
三、Map集合常用API
1、Map集合
Map是双列结合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
2、常用API
-
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。 -
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 -
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。 -
public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合中。 -
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。 -
public boolean containKey(Object key)
:判断该集合中是否有此键。 -
public boolean containValue(Object value)
:判断该集合中是否有此值。
//1、添加元素:无序、不重复、无索引
Map<String, Integer> maps = new HashMap<>();
maps.put("a", 10);
maps.put("b", 20);
maps.put("a", 100);
maps.put("c", 100);
maps.put("d", 10);
maps.put("e", 10);
System.out.println(maps);//{a=100, b=20, c=100, d=10, e=10}
//2、清空集合
// maps.clear();
// System.out.println();//{}
//3、判断集合是否为空,为空返回true ,反之
System.out.println(maps.isEmpty());//false
//4、根据键获取对应值:public V get(Object key)
Integer key = maps.get("a");
System.out.println(key);//100
//5、根据键删除整个元素。(删除键会返回键的值)
System.out.println(maps.remove("a"));//100
System.out.println(maps);//{b=20, c=100, d=10, e=10}
//6、判断是否包含某个键 ,包含返回true ,反之
System.out.println(maps.containsKey("b"));//true
System.out.println(maps.containsKey("a"));//false
//7、判断是否包含某个值。
System.out.println(maps.containsValue(100));//treu
System.out.println(maps.containsValue(11));//false
//8、获取全部键的集合:public Set<K> keySet()
Set<String> keys = maps.keySet();
System.out.println(keys);//[b, c, d, e]
//9、获取全部值的集合:Collection<V> values();
Collection<Integer> values = maps.values();
System.out.println(values);//[20, 100, 10, 10]
//10、集合的大小
System.out.println(maps.size());//4
//11、合并其他Map集合。
Map<String, Integer> map1 = new HashMap<>();
map1.put("a", 1);
map1.put("b", 100);
Map<String, Integer> map2 = new HashMap<>();
map2.put("b", 1);
map2.put("c", 100);
map1.putAll(map2);//把集合map2的元素拷贝一份到map1中去
System.out.println(map1);//{a=1, b=1, c=100}
System.out.println(map2);//{b=1, c=100}
四、MAp集合的遍历
1、键找值
- 先获取Map集合的全部键的Set集合。
- 遍历键的Set集合,然后通过键提取对应值。
涉及的API:
Set<K> keySet()
获取所有键的集合
V get(Object key)
根据键获取值
//1、键找值:第一步,先拿到集合的全部值
Set<String> keys = maps.keySet();
//2、第二步,遍历每个键,根据键取值
for (String key : keys) {
int value = maps.get(key);
System.out.println(key + " =====> " + value);
结果为:
2、键值对
- 先把Map集合转化成Set结合,Set集合中每个元素都是键值对实体类型了。
- 遍历Set集合,然后提取键以及提取值。
键值对涉及到的API:
Set<Map.Entry<K,V>> entrySet()
获取所有键值对对象的集合
K getKey()
获得键
K getValue()
获得值
//1、把Map集合转成Set集合
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
//2、开始遍历
for (Map.Entry<String, Integer> entry : entries){
String key = entry.getKey();
int value = entry.getValue();
System.out.println(key + " ====> " + value);
}
3、lambda表达式
maps.forEach((k,v) ->{
System.out.println(k + " ====> " + v);
});
五、Map集合案例
1、需求
80名学生,现在需要组成秋游活动,提供了四个景点ABCD,每个学生只能选择一个景点,统计出最终那个景点想去的人数最多。
2、分析
- 将80个学生选择的数据拿到程序中去
- 定义Map集合用于存储最终统计的结果
- 遍历80个学生选择的数据,看Map集合中是否存在,不存在存入“数据=1”,存在则其对应值+1
//1、把88个学生选择的数据拿进来
String[] selects = {"A", "B", "C", "D"};
StringBuilder sb = new StringBuilder();
Random r = new Random();
for (int i = 0; i < 80; i++) {
sb.append(selects[r.nextInt(selects.length)]);
}
System.out.println(sb);
//2、定义一个Map集合记录最终的统计结果,键是景点,值是选择的数量
Map<Character, Integer> infos = new HashMap<>();
//3、遍历80个学生选择的数据
for (int i = 0; i < sb.length(); i++) {
//4、提取当前选择景点字符
char ch = sb.charAt(i);
//5、判断Map集合中是否存在这个键
if (infos.containsKey(ch)){
//让其值 +1
infos.put(ch, infos.get(ch) + 1);
}else {
//说明此景点是第一次被选
infos.put(ch, 1);
}
}
//6、输出集合
System.out.println(infos);
结果为:
六、 HashMap
1、HashMap的特点
- HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引。
- 无特有方法,直接用Map里面的方法就可以了。
- HashMap和HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。
- 实际上Se系列结合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。
七、LinkedHashMap
1、概述和特点
- 由键决定:有序,不重复,无索引
- 这里的有序是指的保证存储和取出的元素顺序一致
- 原理:底层数据结构依然哈希表,只是每个键值对元素又额外多了一个双链表机制记录存储的顺序
八、TreeMap
1、TreeMap集合概述和特点
- 由键决定特性:不重复、无索引、可排序
- 可排序:按照键数据的大小默认升序排序。只能对键排序。
- 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序
2、TreeMap集合自定义排序规则有两种
- 类实现Comparable接口,重写比较规则
- 集合自定义comparable比较器对象,重写比较规则
Map<Student, String> maps = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
maps.put(new Student("a",19,'男'), "one");
maps.put(new Student("b",18,'男'), "two");
maps.put(new Student("c",20,'男'), "three");
System.out.println(maps);
结果为: