Map集合
目标:
-能够说出Map集合特点
-使用Map集合添加方法保存数据
-使用”键找值”的方式遍历Map集合
-使用”键值对”的方式遍历Map集合
-能够使用HashMap存储自定义键值对的数据
-能够使用可变参数
内容介绍:
Map集合特点
Map集合的遍历方式
方法可变参数
斗地主案例排序
集合的嵌套
一、Map集合【重点】
1. Map集合的特点
java.util.Mao<K,V>接口:
双列集合根接口,内部定义的方法,子接口/实现类都有。
K: 键的类型,唯一。
V: 值的类型,可以重复。
和java.util.Collection<T>接口: 单列集合的跟接口,无关的
Map<K,V>接口的特点:
1.键唯一,值可以重复。
2.一个键对应一个值,叫一一对应关系(映射关系/键值对关系)
3.依靠键维护映射关系(可以通过键获取到值,但是不能通过值获取键)
2. Map集合实现类的特点
Map接口常用实现类:
java.util.HashMap<K,V>集合特点 ----使用
1.键具备哈希特性:
哈希表 数组 + 单向链表/红黑树(链表数量 > 8 同时 数组元素 >= 64,链表变成红黑树)
2.查询速度非常快,增删速度也不慢
3.键要唯一:键所属的类覆盖重写hashCode和equals方法
4.键无序:不保证存入和取出的数据是一致的
5.键无索引:不能通过索引的方式获取元素
6.允许存储null键和null值
7.线程不同步,不安全,但是效率高
java.util.Hashtable<K,V>集合特点 ----不使用
1.键具备哈希特性:哈希表 + 数组 + 单向链表
2.查询速度非常快,增删速度也不慢
3.见要唯一:键所属的类型覆盖重写hashCode和equals方法
4.键无序:不保证存入和取出的顺序是一致的
5.键无索引:不能通过索引的方式获取元素
6.不允许存储null键和null值
7.线程同步,安全,但是效率低
java.util.LinkedHashMap<K,V>集合特点 ----使用
1.键具备哈希表和双向链表特性:
哈希表 数组 + 双向链表/红黑树(链表数量 > 8 同时 数组元素 <= 64,链表变成红黑树)
2.查询速度非常快,增删速度也不慢
3.哈希特性保证键要唯一:键所属的类覆盖重写hashCode和equals方法
4.哈希特性保证键有序:保证存入和取出的顺序是一致的
5.键无索引:不能通过索引的方式获取键
6.允许存储null键和null值
7.线程不同步,不安全,但是效率高
3. Map集合的常用方法
Map接口中的常用方法
public V put(K key,V value) : 把指定的键与指定的值添加到Map集合中。
如果键key,是第一次存储,返回null
如果键key已经存在,返回时被替换掉的值
键相同,值被替换,
public V get(Object key) : 根据指定的键,在Map集合中获取对应的值。
键不存在:返回null
public V remove(Object key) :
把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值。
public boolean containsKey(Object key) : 判断该集合中是否有此键
public boolean containsValue(Object value) : 判断该集合中是否有此值
// 测试代码
public class Demo02Map {
public static void main(String[] args) {
// 多态的方式创建Map集合对象map,键的数据类型String,值的数据类型 String
Map<String,String> map = new HashMap<>();
// public V put(K key,V value) : 把指定的键与指定的值添加到Map集合中。
System.out.println(map.put("文章","马伊琍")); // null
System.out.println(map);
System.out.println(map.put("文章","姚笛")); // 马伊琍
map.put("黄晓明","杨颖");
map.put("谢霆锋","王菲");
System.out.println(map); // {文章=姚笛, 谢霆锋=王菲, 黄晓明=杨颖}
// public V get(Object key) : 根据指定的键,在Map集合中获取对应的值。
// 键不存在:返回null
System.out.println(map.get("文章")); // 姚笛
System.out.println(map.get("王宝强")); // 键不存在:返回null
// public V remove(Object key) :
// 把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值。
System.out.println(map.remove("谢霆锋")); // 王菲
System.out.println(map); // {文章=姚笛, 黄晓明=杨颖}
// public boolean containsKey(Object key) : 判断该集合中是否有此键
System.out.println("map集合中是否包含谢霆锋:" + map.containsKey("谢霆锋")); // false
System.out.println("map集合中是否包含黄晓明:" + map.containsKey("黄晓明")); // true
// public boolean containsValue(Object value) : 判断该集合中是否有此值
System.out.println("map集合中是否包含姚笛:" + map.containsValue("姚笛")); // true
System.out.println("map集合中是否包含马伊琍:" + map.containsValue("马伊琍")); // false
// 判断集合是否为空
System.out.println("键值对数量: "+map.size()); // 2
System.out.println("判断集合是否为空:" + map.isEmpty()); // false
// 清空集合
map.clear();
System.out.println(map);
System.out.println("键值对数量: "+map.size()); // 0
System.out.println("判断集合是否为空:" + map.isEmpty()); // true
}
}
4. Map集合的获取所有的键和值的功能
Map接口中常用的方法
public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Collection<V> values() : 返回Map集合中的所有值到Collection集合。
// 测试方法
public class Demo02MapMethod {
public static void main(String[] args) {
// 多态的方式创建Map集合对象map
Map<String,Integer> map = new HashMap<>();
//put: 添加键值对
map.put("b",98);
map.put("d",100);
map.put("a",97);
map.put("c",99);
System.out.println(map);
// public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
Set<String> set = map.keySet();
// 增强for遍历
for (String s : set) {
System.out.println(s);
}
System.out.println("------------");
// 更简便分方法
for (String s : map.keySet()) {
System.out.println(s);
}
System.out.println("------------");
// public Collection<V> values() : 返回Map集合中的所有值到Collection集合。
Collection<Integer> c = map.values();
// 迭代器遍历
Iterator<Integer> it = c.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
5. Map集合的遍历_通过键找值
/*
Map集合第一种遍历方式:根据键找值
实现步骤:
1.创建Map几个对象,指定键和值的类型
2.Map集合对象调用put方法,添加键值对
3.Map集合对象map调用keySet方法,获取所有的键对应的Set集合
4.遍历(迭代器/增强for)所有的键对应的Set集合
4.1获取到当前的键
4.2Map集合对象调用get方法,传递当前的键,获取对应的值
4.3打印键和值
*/
//代码实现
public class Demo03_01MapEach {
public static void main(String[] args) {
// 1.创建Map集合对象,指定键和值的类型
Map<String,String> map = new HashMap<>();
// 2.Map集合对象调用put方法,添加键值对
map.put("邓超","孙俪");
map.put("李晨","范冰冰");
map.put("刘德华","柳岩");
// 3.Map集合对象调用keySet方法,获取所有的键对应的Set集合
Set<