1.HashMap底层源码
1.初始容量:16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
2.最大容量2^30
static final int MAXIMUM_CAPACITY = 1 << 30;
3.加载因子:0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
4.树化阈值 --- 当桶(bucket)上的链表数>8时会转成红黑树
static final int TREEIFY_THRESHOLD = 8;
5.链化阈值 --- 当桶(bucket)上的链表数<6时树转链表。
static final int UNTREEIFY_THRESHOLD = 6;
6.树的最小容量:64
static final int MIN_TREEIFY_CAPACITY = 64;
7.继承关系
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {...}
8.扩容原理:n*2
9.通过hash值找到键值对应hash表中的存放位置 (n:桶长度 n总是2的x次方时,hash & (n-1)等价于hash % n,但&比%效率更高)
int index = (n - 1) & hash;
10.放置键值时的扩容条件
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
if ((p = tab[i = (n - 1) & hash]) == null)
...
if (++size > threshold)
resize();
...
}
11.避免碰撞的方式
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
2.方法
1.map.getOrDefault(a,default)
//假设map中含有一个键值对{"name","huang"}
output=map.getOrDefault("name","xiaoming");
此时output="huang",
//假设map为空
output=map.getOrDefault("name","xiaoming");
此时为默认值output="xiaoming"
其他知识点补充:
1.比较两个map集合内容是否相同
//假设已有数据map1和map2
Boolean b = map1.equals(map2);
结果:
但凡map1和map2里的内容一致(排序不一样没有关系),返回true;
否则,返回false