6.3 HashMap和TreeMap

本节摘要
这一节我们将学习Java中三种重要的Map集合:HashMap、LinkedHashMap和TreeMap。通过动手实验,你将掌握它们的基础操作、遍历方法和排序功能。Map的核心特点是存储键值对,让数据组织更加灵活便捷。

HashMap是最常用的Map集合,以键值对的形式存储数据。每个键都是唯一的,但值可以重复。

下面的代码演示了HashMap的基本使用方法:

主要操作
  • put(key, value) - 添加或更新键值对
  • get(key) - 根据键获取值
  • remove(key) - 删除指定键值对
  • containsKey(key) - 判断是否包含指定键
  • containsValue(value) - 判断是否包含指定值

java

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());
    }  
}

HashMap有多种遍历方式,这里介绍两种最常用的方法:

方法一:先获取所有的键,再通过键去获取对应的值

java

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);  
}
记得导包

需要在文件开头添加:

java

import java.util.*;

方法二:直接获取所有的键值对,再从中取出键和值

java

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);
}
顺序问题
HashMap有一个特点:迭代出来的元素顺序和存入的顺序可能不一样。这是因为HashMap内部使用哈希表存储数据。

如果你希望保持插入时的顺序,可以使用LinkedHashMap。它是HashMap的子类,使用双向链表来记住元素的插入顺序。

动手试试

把前面代码中的HashMap改为LinkedHashMap,观察输出的顺序变化:

java

LinkedHashMap<String, String> map = new LinkedHashMap<>();

TreeMap和TreeSet一样,具有自动排序的功能。它会按照键的大小顺序来存储数据。

让我们先看看TreeMap的基本使用:

自动排序
可以看到,TreeMap会自动按照键的大小顺序来存储数据。对于字符串键,是按照字母顺序排列的。

当TreeMap的键是自定义对象时,我们需要告诉它按照什么规则排序:

java

```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);
    }
}
排序效果
运行结果会按照水果价格从低到高的顺序显示:香蕉 → 橙子 → 苹果

text


## 练习作业

### 作业一:掌握LinkedHashMap

1. 创建一个学生类,包含学号、姓名;
2. 创建一个 LinkedHashMap 对象,存储三个学生对象,用学号作为`键`,学生对象作为`值`;
	1. 其中一个学生用自己的真实信息
3. 删除学生后遍历(不要删自己)

### 作业二:掌握TreeMap排序

1. 修改学生类,增加分数属性(score);
2. 修改学生类,实现 Comparable 接口和 compareTo 方法;
3. 创建一个 TreeMap 对象,存储刚刚的三个学生对象;
4. 遍历,观察结果是否有序

相关内容