Map集合是双列集合,也叫键值对集合。
Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值。(值可以重复)当需要存储一一对应的数据时,就可以使用Map集合。
Map集合也具有多种实现类,常见的有HashMap、TreeMap、LinkedHashMap
注:Map系列的集合特点是由键决定的,值只是一个附属品,值不做要求
HashMap:无序、不重复、无索引;
LinkedHashMap:有序、不重复、无索引
TreeMap:按大小默认升序排列、不重复、无索引
package MapDemo;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class MapDemo1 {
public static void main(String[] args) {
//认识Map集合的体系特点
//键值对都可以是null
//HashMap:无序、不重复、无索引
Map<String,Integer> map = new HashMap<>(); //一行经典代码
map.put("嫦娥", 20);
map.put("小九", 31);
map.put("女儿国国王", 29);
map.put("大乔", 18);
map.put("大乔", 18);
map.put("铁扇公主", 31);
map.put(null, null);
System.out.println(map);
System.out.println("==============");
//LinkedHashMap:有序、不重复、无索引
Map<String,Integer> map2 = new LinkedHashMap<>();
map2.put(null, null);
map2.put("嫦娥", 20);
map2.put("小九", 31);
map2.put("女儿国国王", 29);
map2.put("大乔", 18);
map2.put("大乔", 18);
map2.put("铁扇公主", 31);
System.out.println(map2);
}
}
Map集合的常见方法
package MapDemo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
public static void main(String[] args) {
//掌握Map的常用方法
//键不能重复
Map<String, Integer> map = new HashMap<>();
map.put("嫦娥", 20);
map.put("小九", 31);
map.put("女儿国国王", 29);
map.put("大乔", 18);
System.out.println(map.put("大乔", 28)); // 返回被替换的值
map.put("铁扇公主", 31);
map.put(null, null);
System.out.println(map);
System.out.println("==============");
//写代码演示常用方法
System.out.println(map.get("大乔"));//根据键取值
System.out.println(map.get("大乔2"));
System.out.println(map.containsKey("大乔"));//判断键是否存在true
System.out.println(map.containsKey("大乔2"));//false
System.out.println(map.containsValue(31));//判断值是否存在true
System.out.println(map.containsValue(28.0));//false
System.out.println(map.remove("大乔"));//根据键删除键值对,返回被删除的值
System.out.println(map);
//map.clear(); //清空map
System.out.println(map.isEmpty());//判断map是否为空
System.out.println(map.size());//获取map长度
//获取所有键,放到一个Set集合,返回给我们
Set<String> keys = map.keySet();//与Set特性一样,不重复,无索引
for (String key : keys) {
System.out.println(key);
}
//获取所有值,放到一个Collection集合,返回给我们
Collection<Integer> values = map.values(); //值可能会重复,所以要放到Collection集合
for (Integer value : values) {
System.out.println(value);
}
}
}
与Collection类似,Map集合也有添加,删除,获取长度,判空,清空等方法
Map集合的遍历
Map集合有三种常见的遍历方法
1、键找值,将Map集合中的键通过以上的常用方法中的转换键值到Set集合中,用键来找对应的值。
2、键值对,将Map集合中的所有元素转换为键值对类型存储到Set集合中,进行遍历
3、forEach方法,调用java库中的forEach方法进行遍历(其实也是用库里的代码进行键值对类型的转换)
示例
1、键找值
package MapDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTraverseDemo1 {
public static void main(String[] args) {
//掌握Map集合的遍历方式1、键找值
Map<String,Integer> map = new HashMap<>();
map.put("嫦娥", 20);
map.put("小九", 31);
map.put("女儿国国王", 29);
map.put("大乔", 18);
System.out.println(map);
//1、提取Map集合的所有键到Set集合中
Set<String> keys = map.keySet();
System.out.println(keys);
//2、遍历Set集合,得到每一个键
for (String key : keys) {
//3、根据键获取值
Integer value = map.get(key);
System.out.println(key + "=" + value);
}
}
}
2、键值对
package MapDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTraverseDemo2 {
public static void main(String[] args) {
//掌握Map集合的遍历方式2、键值对
Map<String,Integer> map = new HashMap<>();
map.put("嫦娥", 20);
map.put("小九", 31);
map.put("女儿国国王", 29);
map.put("大乔", 18);
System.out.println(map);
//1、把Map集合转换成Set集合,里面的元素类型都是键值对类型(Map.Entry<String,Integer>)
Set<Map.Entry<String,Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
//2、得到每一个键值对
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + "=" + value);
}
}
}
3、forEach并Lambda简化
package MapDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class MapTraverseDemo3 {
public static void main(String[] args) {
//掌握Map集合的遍历方式3、Lambda遍历
Map<String,Integer> map = new HashMap<>();
map.put("嫦娥", 20);
map.put("小九", 31);
map.put("女儿国国王", 29);
map.put("大乔", 18);
System.out.println(map);
//1、直接调用Map集合forEach方法完成遍历
// map.forEach(new BiConsumer<String, Integer>() {
// @Override
// public void accept(String s, Integer integer) {
// System.out.println(s + "=" + integer);
// }
// });
map.forEach((k,v)->{
System.out.println(k + "=" + v);
});
}
}
项目实战
做一个景区投票系统,对所有人想去的景区投票,选出票数最多的景区
package MapDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class MapDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String,Integer> map = new HashMap<>();
map.put("A",0);
map.put("B",0);
map.put("C",0);
map.put("D",0);
while(true)
{
System.out.println("请输入想去的景点,若所有学生选择完毕输入EXIT");
String s = sc.next();
if(map.containsKey(s))
map.put(s, map.get(s)+1);
else if(!s.equals("EXIT")) map.put(s, 1);
if(s.equals("EXIT"))
{
String maxkey = "";
int maxvalue = 0;
for(Map.Entry<String,Integer> entry:map.entrySet())
{
String key = entry.getKey();
Integer value = entry.getValue();
if(value>maxvalue)
{
maxvalue = value;
maxkey = key;
}
System.out.println(key+"="+value);
}
System.out.println("最多人选的景点是"+maxkey+",有"+maxvalue+"人选");
break;
}
}
}
}