Map是一种键值对形式的数据结构
Map<K,V>
- K代表key
- V代表value
Map键值对的规定:
-
我们可以通过key的值来获得相应的值
-
一个映射不能包含重复的键(key)
-
每个键最多只能映射到一个值
-
键只允许有一个空值,(键不重复),值可以有多个空值。
-
无序
Map接口API
Map是接口,使用子类hashmap来实现map提供的方法
Map<String,String> map = new HashMap<>() ;
map.put("白日鼠","白胜");
map.put("豹子头","林冲") ;
map.put("小诸葛","富安") ;
System.out.println(map);
结果:
{豹子头=林冲, 白日鼠=白胜, 小诸葛=富安}
若插入已存在的键,值会被覆盖
map.put("小诸葛","AA") ;
System.out.println(map);
结果:{豹子头=林冲, 白日鼠=白胜, 小诸葛=AA}
插入空键:
map.put(null,"BB");
System.out.println(map);
{null=BB, 豹子头=林冲, 白日鼠=白胜, 小诸葛=AAA}
HashMap
HashMap是map的最常用的实现类
特点:
- key只能支持一个null, 值不做限制
- 线程不安全,如想使用线程安全的HashMap,可以考虑ConcurrentedHashMap,或HashTable或Collections.synchronizedMap(map)(该方法会对map里每个方法都加上synchronized关键字);
==
- putAll:
在map集合中加入另一个map集合
map.putAll(map1);
System.out.println(map);
结果:{null=BB, 智多星=吴用, 入云龙=公孙胜, 豹子头=林冲, 白日鼠=白胜, 小诸葛=AA}
- remove(key)
通过键移除指定键值
map.remove("小诸葛") ;
System.out.println(map);
- get(key)
获得指定键的值
String value = map.get("豹子头");
System.out.println(value);
结果:林冲
- keySet
获得map中的所有键,返回的是集合,用set引用接收即可
Set<String> maps = map.keySet();
System.out.println(maps);
结果:[null, 智多星, 入云龙, 豹子头, 白日鼠]
- 遍历:
for (String key :maps){
value = map.get(key) ;
System.out.println(key+"->"+value);
}
结果:
null->BB
智多星->吴用
入云龙->公孙胜
豹子头->林冲
白日鼠->白胜
- containsKey:判断是否含有相关键
boolean isCon = map.containsKey("豹子头");
System.out.println(isCon);
true
- containsValue:判断是否含有相关值
isCon = map.containsValue("白胜") ;
System.out.println(isCon);
结果:true
- isEmpty:判断是否空
boolean isE = map.isEmpty() ;
System.out.println(isE);
false
TreeMap
该映射根据其键的自然顺序进行排序(Int),或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法
特点:
- 可以按照key来自定义排序
- 因为要支持排序,key不能为null且重复
- 线程不安全
HashTable
- 不允许任何null键值(安全集合)
- 无序
- 线程安全(通过在每个方法上添加synchronized)
HashTable
HashTable和HashMap的区别
-
HashMap线程不安全,HashTable线程安全
-
Hashtable中,key和value都不允许出现null值,否则会抛出NullPointerException异常
- 由于null不是对象,因此无法在其上调用.equals()或.hashCode(),因此Hashtable无法计算哈希以将其用作键,而HashMap专门针对null的情况做了处理
-
HashTable直接使用对象的hashCode,而HashMap重新计算hash值,利用扰动函数使得散落更加均匀,减少Hash碰撞概率
-
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
-
-
两者都通过( n - 1) & hash 判断当前元素存放的位置
LinkedHashMap
- 使用链表将key串在一起