目录
📢 V put(K key,V value) - 设置 key 对应的 value
📢 V get(Object key) - 返回 key 对应的 value
📢 V getOrDefault (Object key , V defaultVaule) - 返回 key 对应的 value,如果 key 不存在则返回默认值 (defaultVaule)
📢 V remova (Object key) - 删除 key 对应的映射关系
📢 Set keySet() - 返回所有 key 的不重复集合
📢 Collection values() - 返回所有 value 的可重复集合
📢 boolean containsKey(Object key) - 判断是否包含 key
📢 boolean containsValue(Object value) - 判断是否包含 value
📢 Set> entrySet() - 返回所有的 key - value 映射关系
Set (Java Platform SE 8 ) (oracle.com)
1.概念
Map 和 Set 是一种专门用于搜索查找的数据结构,其搜索的效率与具体实例化的子类有关。
例如本文中主要概述的 TreeMap 和 HashMap ,TreeSet 和 HashSet。
在以往的搜索查找中,我们常使用的方式有:1.直接遍历 O(N) 2.二分查找 O(log₂N)
这些方式适用于静态查找,何为静态查找呢?
静态查找表:只作查找操作的查找表。
- 查询某个“特定”数据元素是否在查找表中。
- 检索某个“特定”数据元素和各种属性。
动态查找表:在查找过程同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。
- 查找是插入数据元素。
- 查找时删除数据元素。
现实中的查找例如:
- 根据学生姓名查找学生成绩。
- 根据姓名查找联系方式。
- 根据商品名称查询价格。
在查询的过程中可能会进行插入和删除的操作,而 Map 和 Set 就非常适合动态查找
图中可以看出 Set 是实现于 Collection 接口的,而 Map 是没有实现 Collection 接口的。
2.模型
介绍 Map 和 Set 之前需要了解一下什么是模型。
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种 :
1. 纯 key 模型 :没有对应的值
- 查找某字典中某个字
2.key - value 模型:有对应的值
- 查找字典中某个字出现的次数(key == 字,value == 次数)
key 是唯一的,不可重复,value是可以重复的:
- 例如网上购物,查询水杯,水杯都是一样的情况下,而价格可能是不一样的。
Map 中存储 key - value,Set 只存储 key。
3.Map
Map 是一个接口,不能实例化,需要实例化实现他的一个子类,例如TreeMap。
Map 存储的是 Map<K,V>结构的键值对。
3.1 Map的常用方法
此处实例化的是 treeMap 对象,HashMap 在后续 Hash 中会讲到
📢 V put(K key,V value) - 设置 key 对应的 value
public static void main(String[] args) {
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("猫爪杯子",10);
treeMap.put("派大星杯子",25);
treeMap.put("海绵宝宝杯子",30);
System.out.println(treeMap);
}
因为 key 是唯一不重复的,如果你设置的key 在 map 中已经存在,那么将会更新同一 key 的 value
public static void main(String[] args) {
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("猫爪杯子",10);
treeMap.put("猫爪杯子",100);
System.out.println(treeMap);
}
如果你的 key 是无法进行比较的对象,那么将会抛出异常(ClassCastException - 类强制转换异常)
static class Cup {//杯子
String name;
public Cup(String name) {
this.name = name;
}
}
public static void main(String[] args) {
Map<Cup,Integer> treeMap = new TreeMap<>();
Cup cup1 = new Cup("猫爪杯子");
Cup cup2 = new Cup("派大星杯子");
Cup cup3 = new Cup("海绵宝宝杯子");
treeMap.put(cup1,10);
treeMap.put(cup2,25);
treeMap.put(cup3,30);
System.out.println(treeMap);
}
key 不能传入 null 值,value 可以传入 null值。key 传入 null 时抛出空指针异常
public static void main(String[] args) {
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put(null,10);
treeMap.put("派大星杯子",25);
treeMap.put("海绵宝宝杯子",30);
}
📢 V get(Object key) - 返回 key 对应的 value
public static void main(String[] args) {
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("猫爪杯子",10);
treeMap.put("派大星杯子",25);
treeMap.put("海绵宝宝杯子",30);
System.out.println(treeMap.get("猫爪杯子"));
}
如果没有找到 key 则返回 null
public static void main(String[] args) {
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("猫爪杯子",10);
treeMap.put("派大星杯子",25);
treeMap.put("海绵宝宝杯子",30);
System.out.println(treeMap.get("杯"));
}
📢 V getOrDefault (Object key , V defaultVaule) - 返回 key 对应的 value,如果 key 不存在则返回默认值 (defaultVaule)
public static void main(String[] args) {
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("猫爪杯子",10);
treeMap.put("派大星杯子",25);
treeMap.put("海绵宝宝杯子",30);
System.out.println(treeMap.getOrDefault("杯子",100));
}
📢 V remova (Object key) - 删除 key 对应的映射关系
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("猫爪杯子",10);
treeMap.put("派大星杯子",25);
treeMap.put("海绵宝宝杯子",30);
treeMap.remove("派大星杯子");
System.out.println(treeMap);