Java Map集合类(HashMap和TreeMap)用法详解
Java 中的 Map 是一种双列集合,Map 的每个元素都包含一个键对象 Key 和一个值对象 Value,键对象和值对象之间存在对应关系,这种关系称为映射。
Map 中的映射关系是一对一的,一个键只能映射一个值,但允许多个不同的键映射到同一个值上。键对象 Key 必须是唯一的,不允许重复,值对象 Value 允许重复。
Map 是实现映射集合的根接口。Map 定义了关于映射集合的相关的操作方法,常用方法如下表所示。
	
Map 的具体实现类主要有两个:HashMap 和 TreeMap。与实现 Set 的两个类相似,如果在 Map 中插入、删除和定位元素,那么 HashMap 类是最好的选择。但如果要按顺序遍历键,那么 TreeMap 类是最好的选择。
HashMap 类的构造方法有 4 个,如下表所示。
	
【实例】HashMap 类的基本应用。
【实例】HashMap 类的遍历的应用。
TreeMap 类的构造方法和其他常用方法如下表所示。
	
【实例】使用 TreeMap 类保存电话簿中的姓名和电话号码,并按照姓名排序输出。
	
	
Map 中的映射关系是一对一的,一个键只能映射一个值,但允许多个不同的键映射到同一个值上。键对象 Key 必须是唯一的,不允许重复,值对象 Value 允许重复。
Map 是实现映射集合的根接口。Map 定义了关于映射集合的相关的操作方法,常用方法如下表所示。
| 方法声明 | 功能描述 | 
|---|---|
| void clear() | 删除集合中的所有元素 | 
| boolean containsKey(Object key) | 查询集合中是否存在指定的 key | 
| boolean containsValue(Object value) | 查询集合中是否存在指定的 value | 
| 
				Set<Map.Entry<K,V> | 
			返回集合中包含的映射的 Set 集合视图 | 
| boolean equals(Object o) | 比较指定的对象与此集合对象是否相等 | 
| V get(Object key) | 返回指定键所映射的值,若此映射不包含该键的映射关系,则返回 null | 
| boolean isEmpty() | 判断集合是否为空 | 
| 
				Set<K> | 
			返回集合中包含的所有键的 Set 集合视图 | 
| V put(K key, V value) | 添加一个键值对,若存在该键,则替换原有的值 | 
| void putAll(Map<? extends K,? extends V> m) | 将集合 m 的所有键值对复制到当前集合中 | 
| V remove(Object key) | 删除指定键对应的键值对 | 
| default V replace(K key, V value) | 将集合中指定键对象 key 映射的值修改为 value | 
| int size() | 返回集合中键值对的个数 | 
| 
				Collection<V> | 
			返回集合中包含的所有值的集合视图 | 
Map 的具体实现类主要有两个:HashMap 和 TreeMap。与实现 Set 的两个类相似,如果在 Map 中插入、删除和定位元素,那么 HashMap 类是最好的选择。但如果要按顺序遍历键,那么 TreeMap 类是最好的选择。
Java HashMap类
定义 HashMap 类的语法格式如下:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, SerializableHashMap 类是基于哈希表实现的 Map 接口定义的。HashMap 类允许使用 null 键和 null 值。
HashMap 类的构造方法有 4 个,如下表所示。
| 方法声明 | 功能描述 | 
|---|---|
| HashMap() | 构造一个空的 HashMap,具有默认的初始容量(16)和负载因子(0.75) | 
| HashMap(int initialCapacity) | 构造一个空的 HashMap,具有指定的初始容量和默认的负载因子(0.75) | 
| HashMap(int initialCapacity, float loadFactor) | 构造一个空的 HashMap,具有指定的初始容量和负载因子 | 
| HashMap(Mapm) | 构造一个映射关系与指定 Map 相同的新的 HashMap | 
【实例】HashMap 类的基本应用。
import java.util.HashMap;
import java.util.Map;
public class Demo{
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        Integer num = map.put("语文", 99);
        // 因为之前没有“语文”键,所以 put() 方法的返回值为 null
        System.out.println(num);
        map.put("数学", 80);
        num = map.put("语文", 90);
        // 已经存在“语文”键,此时 put() 方法的返回值为原来的值,即 99
        System.out.println(num);
        map.put("物理", 75);
        map.put("英语", 82);
        System.out.println(map);
        System.out.println("----------------");
        num = map.get("物理");
        System.out.println(num);
        num = map.get("化学");
        // 不存在“化学”键,返回值为 null
        System.out.println(num);
        System.out.println("----------------");
        num = map.remove("语文");
        System.out.println(num);
        System.out.println(map);
    }
}
运行结果为:
	null
	99
	{语文=90, 数学=80, 物理=75, 英语=82}
	75
	null
	90
	{数学=80, 物理=75, 英语=82}
【实例】HashMap 类的遍历的应用。
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Demo{
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("语文", 95);
        map.put("数学", 98);
        map.put("英语", 70);
        map.put("物理", 75);
        map.put("化学", 82);
        System.out.println(map);
        /* 遍历所有 Key
         * Set<K> keySet()
         * 获得保存当前所有 Key 的 Set 集合
         */
        // Set<String> keySet = map.keySet();
        for (String key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
        /*
         * 遍历所有 Value
         * Collection<V> values()
         * 获得保存所有 Value 的集合
         */
        // Collection<Integer> values = map.values();
        for (Integer score : map.values()) {
            System.out.println(score);
        }
        /* 遍历键值对
         * Set<Entry> entrySet()
         * java.util.Map.Entry 每个对象表示 Map 集合中的一组键值对
         */
        // Set<Entry<String, Integer>> entry = map.entrySet();
        for (Entry<String, Integer> e : map.entrySet()) {
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key + ":" + value);
        }
    }
}
运行结果为:
	{物理=75, 数学=98,化学=82, 语文=95, 英语=70}
	物理:75
	数学:98
	化学:82
	语文:95
	英语:70
	75
	98
	82
	95
	70
	物理:75
	数学:98
	化学:82
	语文:95
	英语:70
Jva TreeMap类
定义 TreeMap 类的语法格式如下:public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, SerializableTreeMap 类是对基于红黑树(Red-Black tree)的 NavigableMap 接口的具体实现。该集合根据键的自然顺序进行排序,或者根据构造集合对象时提供的 Comparator 进行排序。
TreeMap 类的构造方法和其他常用方法如下表所示。
| 方法声明 | 功能描述 | 
|---|---|
| TreeMap() | 使用其键的自然排序构造一个新的、空的 TreeMap | 
| TreeMap(Comparator<? super K> comparator) | 构造一个新的、空的 TreeMap,按照给定的比较器排序 | 
| TreeMap(Map<? extends K,? extends V> m) | 构造一个新的 TreeMap,其中包含与给定 Map 类的对象 m 相同的映射,根据其键的自然顺序进行排序 | 
| Map.Entry<K,V> ceilingEntry(K key) | 返回一个大于或等于给定键的最小键值对。若不存在,则返回 null | 
| K ceilingKey(K key) | 返回一个大于或等于给定键的最小键值对。若不存在,则返回 null | 
| NavigableSet<K> descendingKeySet() | 返回此集合中所有键的逆序集合视图 | 
| Map.Entry<K,V> firstEntry() | 返回此集合中最小的键值对。若集合为空,则返回 null | 
| K firstKey() | 返回此集合中的第一个(最小)键 | 
| V get(Object key) | 返回指定键所映射的值。若不存在,则返回 null | 
| Set<K> keySet() | 返回此集合中所有键的 Set 视图 | 
| Map.Entry<K,V> lastEntry() | 返回此集合中最大键的键值对。若为空,则返回 null | 
| Map.Entry<K,V> pollFirstEntry() | 移除并返回此集合中最小键的键值对。若为空,则返回 null | 
| Map.Entry<K,V> pollLastEntry() | 移除并返回此集合中最大键的键值对。若为空,则返回 null | 
【实例】使用 TreeMap 类保存电话簿中的姓名和电话号码,并按照姓名排序输出。
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Demo{
    public static void main(String[] args) {
        // 创建 TreeMap 集合对象
        TreeMap<String, String> telephonelist = new TreeMap<>();
        // 添加 4 个键值对
        telephonelist.put("zhang san", "13566568721");
        telephonelist.put("li si", "15566254221");
        telephonelist.put("wang wu", "13166257821");
        telephonelist.put("liu liu", "13747258571");
        Set<Map.Entry<String, String>> mylist = telephonelist.entrySet();
        System.out.println("我的电话簿:");
        for (Map.Entry t : mylist) {
            System.out.printf("姓名:%-5s; 电话号码:%s\n", t.getKey(), t.getValue());
        }
    }
}
运行结果为:
	我的电话簿:
	姓名:li si    ; 电话号码:15566254221
	姓名:liu liu  ; 电话号码:13747258571
	姓名:wang wu ; 电话号码:13166257821
	姓名:zhang san; 电话号码:13566568721
 ICP备案:
 公安联网备案: