Map集合的特点(map集合内部也是一个数组)
- 无序,键值对,键不能重复,值可以重复,
- 键重复则覆盖,没有继承Collection接口
- 扩容:初始容量16,负载因子0.75,扩容增量1倍
- 先获取所有键的Set集合,再遍历(通过键获取值)
- 取出保存所有Entry的Set,再遍历此Set即可
public class a {
private Map<String, String> map =new HashMap<>();
@Before
public void setup() {
map.put("1", "ew");
map.put("2", "fd");
map.put("4", "hg");
map.put("3", "jh");
map.put("3", "gf");
map.put("5", "fd");
System.out.println(map);
Map<String, String> map2 =new HashMap<>();
map2.put("g", "re");
map2.put("h", "fg");
map2.put("y", "hg");
map2.put("k", "hg");
map2.put("h", "hg");
map2.remove("k");
map.putAll(map2);
map.putIfAbsent("k", "hg");
System.out.println(map2);
System.out.println(map.size());
}
@Test
public void test01() {
map.get("3");
map.put("5", "nf");
Iterator<String> it=map.keySet().iterator();
while(it.hasNext()) {
String n=it.next();
System.out.println(n+":"+map.get(n));
}
Iterator<Entry<String, String>> emap = map.entrySet().iterator();
while(emap.hasNext()) {
Entry<String, String> entry=emap.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
put执行图
HashTable
- 线程安全,不常用
- 他的数据都是通过一把锁锁住的,力度太大了
ConcurrentHashMap
- 线程安全,比HashTable性能高
- jdk1.8之前,有16把锁所著
- jdk1.8后,每一个table都有一把锁,并且使用了CAS操作,处理并发问题的能力更加高
TreeMap
- key值按一定的顺序排序
- 添加或获取元素时性能较HashMap慢–因为需求维护内部的红黑树,用于保证key值的顺序
LinkedHashMap
- 继承HashMap
- LinkedHashMap是有序的,且默认为插入顺序
- 当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了