6.3 HashMap和TreeMap

系列 - JAVA集合
目录
本节摘要
这一节我们将学习Java中三种重要的Map集合:HashMap、LinkedHashMap和TreeMap。通过动手实验,你将掌握它们的基础操作、遍历方法和排序功能。Map的核心特点是存储键值对,让数据组织更加灵活便捷。
任务一:HashMap的基础操作
HashMap是最常用的Map集合,以键值对的形式存储数据。每个键都是唯一的,但值可以重复。
Step 1 基础操作
下面的代码演示了HashMap的基本使用方法:
主要操作
put(key, value)
- 添加或更新键值对get(key)
- 根据键获取值remove(key)
- 删除指定键值对containsKey(key)
- 判断是否包含指定键containsValue(value)
- 判断是否包含指定值
import java.util.HashMap;
public class Example15 {
public static void main(String[] args) {
HashMap map = new HashMap(); // 创建Map对象
map.put("1","张三");
map.put("2","李四"); //存储键和值
map.put("3","王五");
System.out.println("1:" + map.get("1")); // 根据键获取值
System.out.println("2:" + map.get("2"));
System.out.println("3:" + map.get("3"));
System.out.println("键值对数量:" + map.size());
// 删除“1:张三”
map.remove("1");
if (map.containsKey("1")) {
System.out.println("1号存在");
} else {
System.out.println("1号不存在");
}
if (map.containsValue("李四")) {
System.out.println("李四存在");
} else {
System.out.println("李四不存在");
}
// 删除所有
map.clear();
System.out.println("键值对数量:" + map.size());
}
}
Step 2 遍历HashMap
HashMap有多种遍历方式,这里介绍两种最常用的方法:
方法一:先获取所有的键,再通过键去获取对应的值
Set keySet = map.keySet(); //获取键的集合
Iterator it = keySet.iterator();//迭代键的集合
while (it.hasNext()) {
Object key = it.next();
Object value = map.get(key); //获取每个键所对应的值
System.out.println(key + ":" + value);
}
记得导包
需要在文件开头添加:
import java.util.*;
方法二:直接获取所有的键值对,再从中取出键和值
Set entrySet = map.entrySet();
Iterator it = entrySet.iterator(); // 获取Iterator对象
while (it.hasNext()){
//获取集合中键值对映射关系
Map.Entry entry = (Map.Entry) (it.next());
Object key = entry.getKey(); //获取Entry中的键
Object value = entry.getValue(); //获取Entry中的值
System.out.println(key + ":" + value);
}
任务二:LinkedHashMap保持插入顺序
顺序问题
HashMap有一个特点:迭代出来的元素顺序和存入的顺序可能不一样。这是因为HashMap内部使用哈希表存储数据。
如果你希望保持插入时的顺序,可以使用LinkedHashMap。它是HashMap的子类,使用双向链表来记住元素的插入顺序。
动手试试
把前面代码中的HashMap改为LinkedHashMap,观察输出的顺序变化:
LinkedHashMap<String, String> map = new LinkedHashMap<>();
任务三:TreeMap的自动排序
TreeMap和TreeSet一样,具有自动排序的功能。它会按照键的大小顺序来存储数据。
Step 1 基础操作
让我们先看看TreeMap的基本使用:
自动排序
可以看到,TreeMap会自动按照键的大小顺序来存储数据。对于字符串键,是按照字母顺序排列的。
Step 2 自定义排序规则
当TreeMap的键是自定义对象时,我们需要告诉它按照什么规则排序:
```java
import java.util.TreeMap;
class Fruit implements Comparable<Fruit> {
String name;
double price;
public Fruit(String name, double price) {
this.name = name;
this.price = price;
}
// 按价格从低到高排序
@Override
public int compareTo(Fruit other) {
if(this.price > other.price) return 1;
if(this.price < other.price) return -1;
return 0;
}
public String toString() {
return name + ":" + price + "元";
}
}
public class Main {
public static void main(String[] args) {
// 使用TreeMap,以Fruit对象为键
TreeMap<Fruit, String> fruitMap = new TreeMap<>();
fruitMap.put(new Fruit("苹果", 5.5), "红色");
fruitMap.put(new Fruit("香蕉", 3.5), "黄色");
fruitMap.put(new Fruit("橙子", 4.5), "橙色");
// 输出会按价格从低到高排列
System.out.println(fruitMap);
}
}
排序效果
运行结果会按照水果价格从低到高的顺序显示:香蕉 → 橙子 → 苹果
## 练习作业
### 作业一:掌握LinkedHashMap
1. 创建一个学生类,包含学号、姓名;
2. 创建一个 LinkedHashMap 对象,存储三个学生对象,用学号作为`键`,学生对象作为`值`;
1. 其中一个学生用自己的真实信息
3. 删除学生后遍历(不要删自己)
### 作业二:掌握TreeMap排序
1. 修改学生类,增加分数属性(score);
2. 修改学生类,实现 Comparable 接口和 compareTo 方法;
3. 创建一个 TreeMap 对象,存储刚刚的三个学生对象;
4. 遍历,观察结果是否有序