1,存放:
V put(K key,V val)//如果遇到重复的key,覆盖原来的val的值,返回原来的val
void putAll(Map m)//将一个指定的Map对象所有的键值对添加到里面
V putifAbsent(K key ,V val),如果存在该key值,则不会存进去该val值,返回已经存在的那个val值,相反,不存在要插入的Key,则不会插入此val值。
2,获取
V get(key) / /获取对应的val值
V getOrDefault(key , val)// 如果该Key对应的val不存在,则通过该val代替。存在,则输出原来的val值
3,删除
V remove(Key)通过该Key可以去删除对应的键值对
V remove(Key,value)通过该Key,和value共同决定去删除对应的键值对
4,替换
V replace(K Key ,V val)//通过Key去找到要被替换的val值,然后把值修改为该val
boolean replace(K Key ,V odval, V newval)//通过Key和 oldval去找到要被替换的键值对,然后把value值修改为该newval
void replaceAll(BiFunction<>)实现BiFunction接口,每次循环去对其val值操作之后返回并修改,可以实习在一些复杂的场景中去挨个修改value值
eg:
map.replaceAll(new BiFunction<String, String, String>() {
@Override
public String apply(String Key, String value) {
// TODO Auto-generated method stub
if(u.startsWith("中国")) {
return u;
}else {
return String.format("[%s]",u);
}
}
});
5通过计算value值,然后把计算后的value值存入原有Map中,如果对应的val为空,则传入的val值为null,
map.compute("jp5", new BiFunction<String,String, String>() {
@Override
public String apply(String key, String val) {
return val+1;
}
});
6相较于前面的方法,传入的Key值不存在时执行此方法,通过计算value值,然后把计算后的value值存入原有Map中,
map.computeIfAbsent("jp5",new Function<String, String>() {
@Override
public String apply(String Key) {
return "23344";
}
} );
7相较于前面的方法,传入的Key值存在时执行此方法,通过计算value值,然后把计算后的value值存入原有Map中,
map.computeIfPresent("jp5", new BiFunction<String, String, String>() {
@Override
public String apply(String key, String val) {
return val+"爱你";
}
});
和上面方法类似,如果遇到重复的Key,则把相对应的val与1传进来的val处理之后又返回赋给,不重复直接创建新的键值对
map.merge(s1, 1, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer val2, Integer val) {
// TODO Auto-generated method stub
return val2+ val;
}
map的遍历:
1
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
// TODO Auto-generated method stub
System.out.printf("%s:%s",key,value);
}
});
2,
Set<String> keySet = map.keySet();//获取所有的Key,返回set集合
Collection<String> valueCollection = map.values();//获取所有的value,返回集合
Set<Entry<String, String>> entry = map.entrySet();//entry是Node的父类,把它封装成entry对象,然后放到set集合里,可以直接遍历每个键值对
二,扩容方式:
1,第一次添加键值对时,数组长度扩容为16;
2,当数组中的单链表长度小于八且数组长度小于64时,会去扩容为原来数组长度的2倍
3,当数组长度等于64且数组中的单链表长度大于8时,会产生红黑树。
4,当数组内容长度大于等于数组长度乘以加载因子(也就是扩容阈值)时,会扩容为原来的两 loadFactor倍。
HashMap底层的关键四个超参数:
Node [] table 底层的数组
load loadFactor 加载因子,用来决定扩容阈值=数组长度乘以加载因子
float threshold 扩容阈值
size 数组的长度