【第六章】集合类:Map

1.Map接口简介

Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value

2.HashMap集合

HashMap集合是Map接口的一个实现类,用于存储键值映射关系,但HashMap集合没有重复的键并且键值无序。接下来通过一个案例学习HashMap的用法

1 import java.util.*;
2 public class Example14 {
3	public static void main(String[] args) {
4		HashMap map = new HashMap(); // 创建Map对象
5		map.put("1", "张三");     // 存储键和值
6		map.put("2", "李四");
7		map.put("3", "王五");
8		System.out.println("1:" + map.get("1"));  // 根据键获取值
9		System.out.println("2:" + map.get("2"));
10		System.out.println("3:" + map.get("3"));
11	}
12 }

程序运行结果如下图。

上述代码中,4~7行代码声明了一个HashMap集合并通过Mapput(Object keyObject value)方法向集合中加入3个元素,第8~10行代码是通过Mapget(Object key)方法获取与键对应的值。

3.TreeMap集合

HashMap集合存储的元素的键值是无序的和不可重复的,为了对集合中的元素的键值进行排序,Map接口提供了另一个可以对集合中元素键值进行排序的类TreeMap

接下来通过一个案例演示TreeMap集合的用法

1 import java.util.Iterator;
2 import java.util.Set;
3 import java.util.TreeMap;
4 public class Example19 {
5    public static void main(String[] args) {
6        TreeMap map = new TreeMap();      // 创建Map集合
7        map.put(3, "李四");// 存储键和值
8        map.put(2, "王五");
9        map.put(4, "赵六");
10        map.put(3, "张三");       
11 Set keySet = map.keySet();
12        Iterator it = keySet.iterator();
13        while (it.hasNext()) {
14            Object key = it.next();
15            Object value = map.get(key); // 获取每个键所对应的值
16            System.out.println(key+":"+value);
17        }
18    }
19 }

        

程序运行结果如下图。

上述代码中,6~10行代码是通过Mapput(Object keyObject value)方法向集合中加入4个元素;第11~17行代码是使用迭代器遍历集合中的元素并通过元素的键获取对应的值,并打印。从运行结果可以看出,添加的元素已经自动排序,并且键值重复存入的整数3只有一个,只是后边添加的值“张三”覆盖了原来的值“李四”。这也证实了TreeMap中的键必须是唯一的,不能重复并且有序,如果存储了相同的键,后存储的值则会覆盖原有的值。

TreeMap集合之所以可以对添加的元素的键值进行排序,其实现同TreeSet一样,TreeMap的排序也分自然排序与比较排序两种。接下来通过一个案例演示比较排序法实现按键值排序,在该案例中,键是自定义类值是String

1 import java.util.*;
2 class Student {
3    private String name;
4    private int age;
5    public String getName() {
6        return name;
7    }
8    public void setName(String name) {
9        this.name = name;
10    }
11 public int getAge() {
12        return age;
13    }
14    public void setAge(int age) {
15        this.age = age;
16    }
17    public Student(String name, int age) {
18        super();
19        this.name = name;
20        this.age = age;
21    }
22 @Override
23    public String toString() {
24        return "Student [name=" + name + ", age=" + age + "]";
25    }
26 }
27 public class Example20 {
28    public static void main(String[] args) {
29        TreeMap tm = new TreeMap(new Comparator<Student>() {
30            @Override
31            public int compare(Student s1, Student s2) {
32                int num = s1.getName().compareTo(s2.getName());//按照姓名比较
33                return num == 0 ? num:s1.getAge() - s2.getAge();
34            }
35        });
36 tm.put(new Student("张三", 23), "北京");
37        tm.put(new Student("李四", 13), "上海");
38        tm.put(new Student("赵六", 43), "深圳");
39        tm.put(new Student("王五", 33), "广州");
40        Set keySet = tm.keySet();
41        Iterator it = keySet.iterator();
42        while (it.hasNext()) {
43            Object key = it.next();
44            Object value = tm.get(key); // 获取每个键所对应的值
45            System.out.println(key+":"+value);
46        }
47    }
48 }

        

上述代码中,2~26行代码定义了一个Student类;第29~35行代码定义了一个TreeMap集合,并在该集合中通过匿名内部类的方式实现了Comparator接口,然后重写了compare()方法,在compare()方法中通过三目运算符的方式自定义了排序方式为先按照年龄排序,年龄相同再按照姓名排序。第36~46行代码是通过Mapput(Object keyObject value)方法向集合中加入4个键为Student对象值为String类型的元素,并使用迭代器将集合中元素打印输出。

4.三种集合的应用

4.1 要求

1.创建一个ArrayList,包含数字1到5,然后遍历这个ArrayList并打印出每个元素的值。

2. 创建一个HashSet,添加一些不同的颜色字符串(如"红色"、“蓝色”、“绿色”、“黄色”),然后尝试添加重复的颜色并观察集合的变化。
3. 创建一个HashMap,将一些国家的名称作为键,其首都作为值(例如:“中国”   −>“北京”,“美国”   −>“华盛顿”),然后遍历这个HashMap并打印出每个国家及其首都。

4.2 参考代码

ArrayList<Integer> numbersList = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
    numbersList.add(i);
}

for (Integer number : numbersList) {
    System.out.println(number);
}

ArrayList<Integer> numbersList = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
    numbersList.add(i);
}

for (Integer number : numbersList) {
    System.out.println(number);
}

HashMap<String, String> capitalsMap = new HashMap<>();
capitalsMap.put("中国", "北京");
capitalsMap.put("美国", "华盛顿");
capitalsMap.put("英国", "伦敦");

for (Map.Entry<String, String> entry : capitalsMap.entrySet()) {
    System.out.println("国家:" + entry.getKey() + ",首都:" + entry.getValue());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值