java map集合详解
1、 Interface Map<K,V>
所有已知实现类:
AbstractMap , Attributes , AuthProvider , ConcurrentHashMap , ConcurrentSkipListMap , EnumMap , HashMap , Hashtable , IdentityHashMap , LinkedHashMap , PrinterStateReasons , Properties , Provider , RenderingHints , SimpleBindings , TabularDataSupport , TreeMap , UIDefaults , WeakHashMap
这些 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
2、常用方法:
clear() 从该地图中删除所有的映射(可选操作)。
map.put("key1", "value1"); 添加一个元素
map.putAll(Map<? extends K,? extends V> m) 添加一个Map集合
map.get("key1") 根据key获取value
map.remove("key1"); 根据key移除一个元素
boolean containsKey(Object key) 判断一个key在当前集合中是否存在
boolean containsValue(Object value) 判断一个value在当前集合中是否存在
boolean isEmpty() 如果此地图不包含键值映射,则返回 true 。也就是map没有内容返回true
int size() 返回该地图中键值映射的数量
Set<K> keySet() 返回该地图中包含的键的集合视图
Set<Map.Entry<K,V>> entrySet() 该地图中包含的映射的集合视图 。
default V replace(K key,V value) 在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值),在指定的键不存在时,方法会return回来一个null。
replace(k,v,v) 第二的新增的Map replace方法在替换现存值方面有更窄的释义范围。当那个方法(上一个replace方法)只是涵盖指定的键在映射中有任意一个有效的值的替换处理,而这个“replace”方法接受一个额外的(第三个)参数,只有在指定的键和值都匹配的情况下才会替换。

3、常用方法的实际使用测试:
1 代码如下所示
import java.util.*;
public class Test {
public static void main(String[] args) {
// 初始化,10W次赋值
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < 100000; i++)
map.put(i, i);
/** 增强for循环,keySet迭代 */
long start = System.currentTimeMillis();
for (Integer key : map.keySet()) {
map.get(key);
}
long end = System.currentTimeMillis();
System.out.println("增强for循环,keySet迭代 -> " + (end - start) + " ms");
/** 增强for循环,entrySet迭代 */
start = System.currentTimeMillis();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
entry.getKey();
entry.getValue();
}
end = System.currentTimeMillis();
System.out.println("增强for循环,entrySet迭代 -> " + (end - start) + " ms");
/** 迭代器,keySet迭代 */
start = System.currentTimeMillis();
Iterator<Integer> iterator = map.keySet().iterator();
Integer key;
while (iterator.hasNext()) {
key = iterator.next();
map.get(key);
}
end = System.currentTimeMillis();
System.out.println("迭代器,keySet迭代 -> " + (end - start) + " ms");
/** 迭代器,entrySet迭代 */
start = System.currentTimeMillis();
Iterator<Map.Entry<Integer, Integer>> iterator1 = map.entrySet()
.iterator();
Map.Entry<Integer, Integer> entry;
while (iterator1.hasNext()) {
entry = iterator1.next();
entry.getKey();
entry.getValue();
}
end = System.currentTimeMillis();
System.out.println("迭代器,entrySet迭代 -> " + (end - start) + " ms");
}
}
1、增强for循环使用方便,但性能较差,不适合处理超大量级的数据。
2、迭代器的遍历速度要比增强for循环快很多,是增强for循环的2倍左右。
3、使用entrySet遍历的速度要比keySet快很多,是keySet的1.5倍左右。




1、HashMap的基本原理