引言:java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。本文主要介绍java map的初始化、用法、map的四种常用的遍历方式、map的排序以及常用api。
文章目录
java集合框架图
不清楚集合之间的关系请先看下:【Java】集合类说明及区别
list,set,map对比
接口 | 子接口 | 是否有序 | 是否允许元素重复 |
---|---|---|---|
Collection | 否 | ||
List | ArrayList | 否 | 是 |
LinkedList | 否 | 是 | |
Vector | 否 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | 否 | 否 | |
TreeSet | 是 (用二叉排序树) | 否 | |
Map | AbstractMap | 否 | 使用key-value来映射和存储数据,key必须唯一,value可以重复 |
HashMap | 否 | ||
TreeMap | 是(用二叉排序树) | 使用key-value来映射和存储数据,key必须唯一,value可以重复 |
Map介绍
类型介绍
Java 自带了各种 Map 类。这些 Map 类可归为三种类型:
1. 通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现
HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、 WeakHashMap、ConcurrentHashMap
2. 专用Map,通常我们不必亲自创建此类Map,而是通过某些其他类对其进行访问
java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、 java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults
3. 一个用于帮助我们实现自己的Map类的抽象类
AbstractMap
类型区别
1.HashMap
最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
2.TreeMap
能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
3.Hashtable
与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
4.LinkedHashMap
保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。
其他
keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
用法示例
以HashMap为例:
构造数据:
Map<String,Object> res = new HashMap<String,Object>();
res.put("d","h");
res.put("c","g");
res.put("b","f");
res.put("a","e");
1.增强型for循环遍历
keySet()遍历
System.out.println("keySet()-For循环");
for(String s : res.keySet()){
System.out.println(s+":"+res.get(s));
}
输出:
keySet()-For循环
a:e
b:f
c:g
d:h
entrySet()遍历
System.out.println("entrySet()-For循环");
for(Map.Entry<String,Object> entry : res.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
输出:
entrySet()-For循环
a:e
b:f
c:g
d:h
2.Iterator迭代器遍历
keySet()遍历
System.out.println("keySet()-Iterator迭代器");
Iterator <String> it = res.keySet().iterator();
while (it.hasNext()){
String key = it.next();
System.out.println(key+":"+res.get(key));
}
输出:
keySet()-Iterator迭代器
a:e
b:f
c:g
d:h
entrySet()遍历
System.out.println("entrySet()-Iterator迭代器");
Iterator<Map.Entry<String,Object>> it1 = res.entrySet().iterator();
while (it1.hasNext()){
Map.Entry<String,Object> entry = it1.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
输出:
entrySet()-Iterator迭代器
a:e
b:f
c:g
d:h
遍历性能总结:
1.增强for循环使用方便,但性能较差,不适合处理超大量级的数据。
2.迭代器的遍历速度要比增强for循环快很多,是增强for循环的2倍左右。
3.使用entrySet遍历的速度要比keySet快很多,是keySet的1.5倍左右。
3.使用比较器对map进行排序
对key排序:
List<Map.Entry<String,Object>> list = new ArrayList<Map.Entry<String, Object>>(res.entrySet());
//比较器实现比较排序
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
@Override //重写 Comparator<Map.Entry<String, Object>>() 方法
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
return o1.getKey().compareTo(o1.getKey());
}
});
for (Map.Entry<String,Object> mapping : list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
输出
a:e
b:f
c:g
d:h
对value排序:
List<Map.Entry<String,Object>> list = new ArrayList<Map.Entry<String, Object>>(res.entrySet()); //比较器实现比较排序
//Collections是提供一系列静态方法的静态工具类,而collection是集合类的顶级接口
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
//
@Override
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
return o1.getValue().toString().compareTo(o1.getValue().toString());
}
});
for (Map.Entry<String,Object> mapping : list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
输出
d:h
a:e
b:f
c:g
d:h
4.其他api
函数 | 功能 |
---|---|
clear() | 从 Map 中删除所有映射 |
remove(Object key) | 从 Map 中删除键和关联的值 |
put(Object key, Object value) | 将指定值与指定键相关联 |
putAll(Map t) | 将指定 Map 中的所有映射复制到此 map |
entrySet() | 返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素 |
keySet() | 返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值) |
values() | 返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值) |
get(Object key) | 返回与指定键关联的值 |
containsKey(Object key) | 如果 Map 包含指定键的映射,则返回 true |
containsValue(Object value) | 如果此 Map 将一个或多个键映射到指定值,则返回 true |
isEmpty() | 如果 Map 不包含键-值映射,则返回 true |
size() | 返回 Map 中的键-值映射的数目 |