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集合并通过Map的put(Object key,Object value)方法向集合中加入3个元素,第8~10行代码是通过Map的get(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行代码是通过Map的put(Object key,Object 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行代码是通过Map的put(Object key,Object value)方法向集合中加入4个键为Student对象值为String类型的元素,并使用迭代器将集合中元素打印输出。
4.三种集合的应用
4.1 要求
1.创建一个ArrayList,包含数字1到5,然后遍历这个ArrayList并打印出每个元素的值。
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());
}

被折叠的 条评论
为什么被折叠?



