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备案:
公安联网备案: