一、Map
存储的key/value 键值对, key: 任意数据类型, (实际开发中,key 一般String), value 任意数据类型,
key: 要求唯一的, value可以重复
实现类: HashMap(线程不安全), HashTable(老版本,面试问)(线程安全),TreeMap, Properties(配置文件,key/value 都是String)
如果往Map添加数据, key在Map已存在, 把新添加的数据的value 覆盖Map的对应key的value
Map里面的key可以为null,但是只能有一个,多个的时候,后面的会覆盖前面的
二、HashMap
数据结构: 哈希表(数组/链表(|红黑树))
JDK1.7(包含1.7)之前: 数组+链表
JDK1.8 (包含1.8)之后, 引入红黑树(提高查询效率): 数组+链表/红黑树
1.四个构造方法
HashMap() 构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。 HashMap(int initialCapacity) 构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。 HashMap(int initialCapacity, float loadFactor) 构造一个空的 HashMap具有指定的初始容量和负载因子。 HashMap(Map<? extends K,? extends V> m) 构造一个新的 HashMap与指定的相同的映射 Map 。
(1)注意容量只能是2的幂次方
//创建一个HashMap 初始容量: 16 加载因子:0.75
HashMap map = new HashMap();
//创建一个HashMap指定容量: 2的幂次方, 加载因子不去设置,
HashMap map2 = new HashMap(25);
System.out.println(tableSizeFor(25));
static int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : n + 1;
}
2.关于方法
//添加
map.put("k1","v1");
map.put("k2","v2");
map.put("k1","v11"); //key存在, 覆盖value
System.out.println(map);
//删除
map.remove("k1");
System.out.println(map);
//获取, 根据key获取value get
System.out.println(map.get("k2"));
System.out.println(map.get("k3")); //key不存在,返回null
//清空 clear
//map.clear();
//判断map是否空(map是否有元素) true: 没有元素, false: 有
// System.out.println(map.isEmpty());
//判断key是否存在
System.out.println(map.containsKey("k2"));
System.out.println(map.containsKey("k1"));
//获取map的元素个数 size()
System.out.println(map.size());
3.遍历方式
HashMap map = new HashMap();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
//第一种遍历方式
/* Set keys = map.keySet();
//使用迭代器
//简写forEach循环
for(Object key:keys){
//根据key获取value
Object value = map.get(key);
System.out.println("key:"+key+"-value:"+value);
}*/
//第二种: 遍历value
/* Collection values = map.values();
//使用迭代器
//简写forEach循环
for(Object value:values){
//获取value
System.out.println("-value:"+value);
}*/
最常用:
//第三种方式
//Entry: key/value对
Set entrys = map.entrySet();
//使用迭代器
//简写forEach循环
for(Object entryObj : entrys){
Map.Entry entry = (Map.Entry)entryObj;
//获取key, value
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println("key:"+key+"-value:"+value);
}
4.原理
数组+链表/红黑树
hashMap扩容: 达到扩容阈值: = 容量 * 加载因子