HashMap中的方法详解与其扩容方式

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  数组的长度

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值