1、特点
每个元素是一个键值对。
每个元素由两部分构成,一部分叫键,一部分叫值。
键是唯一的,每个元素的键不能相同,而值是可以相同的。
2、map接口
- |
V
|put(K key, V value)
将指定的值与该映射中的指定键相关联(可选操作)。- |
V
|get(Object key)
返回到指定键所映射的值,或null
如果此映射包含该键的映射。- |
V
|remove(Object key)
如果存在(从可选的操作),从该地图中删除一个键的映射。- |
int
|size()
返回此地图中键值映射的数量。- |
boolean
|isEmpty()
如果此地图不包含键值映射,则返回true
。
boolean
containsKey(Object key)
如果此映射包含指定键的映射,则返回true
。boolean
containsValue(Object value)
如果此地图将一个或多个键映射到指定的值,则返回true
。- |
void
|clear()
从该地图中删除所有的映射(可选操作)。- |
Set<K>
|keySet()
返回此地图中包含的键的Set
视图。- |
Collection<V>
|values()
返回此地图中包含的值的Collection
视图。- |
Set<Map.Entry<K,V>>
|entrySet()
返回此地图中包含的映射的Set
视图。
3、Map的实现类
HashMap 、HashTable 、 TreeMap
(1)HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
(2)HashTable:实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值,即不允许null键null值。
(3)TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。不允许null键,允许null值。
三种常规Map性能:
HashMap:适用于在Map中插入、删除和定位元素。
HashTable:单线程环境下,性能低,适用于完全的线程安全。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
总结:
HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap,仅在你需要完全的线程安全的时候使用Hashtable。
4、HashMap使用方法
// 创建map集合
Map map=new HashMap();
// 获取键值对数量
System.out.println(map.size());
System.out.println(map.isEmpty());
// 添加键值对
map.put(1001,"zhangsan");
map.put(1002,"lisi");
map.put(1003,"wangwu");
map.put(1004,"maliu");
System.out.println(map.size());
// 获取元素
System.out.println(map.get(1001));
System.out.println(map.get(1002));
System.out.println(map.get(1003));
System.out.println(map.get(1004));
// 删除元素
map.remove(1001);
System.out.println(map.size());
System.out.println(map.get(1001));
// 判断是否包含指定的键或值
System.out.println(map.containsKey(1001));
System.out.println(map.containsValue("lisi"));
// 清空集合
map.clear();
5、Map集合遍历
// 创建map集合
Map map=new HashMap();
// 添加键值对
map.put(1001,"zhangsan");
map.put(1002,"lisi");
map.put(1003,"wangwu");
map.put(1004,"maliu");
// 修改操作:修改键对应的值
map.put(1001,"zhangsanfen");
map.put(1005,"lisi");
// System.out.println(map.size());
// System.out.println(map.get(1001));
// 获取所有元素的键,以set集合返回
Set ks = map.keySet();
ks.forEach((k)->{
System.out.println(k);
});
// 获取所有元素的值,以Collection集合返回
Collection vs = map.values();
vs.forEach((v)->{
System.out.println(v);
});
// 获取所有的键值对,以Set集合返回
// 每个键值对使用Map.Entry类型存储
Set set = map.entrySet();
for(Object o:set){
Map.Entry entry =(Map.Entry)o;
System.out.println(entry.getKey()+","+entry.getValue());
}
// 等价键值对遍历
// 先找到所有元素的键,然后在根据键找值
Set ks1 = map.keySet();
for(Object k:ks1){
Object v = map.get(k);
System.out.println(k+"="+v);