java map put返回值_HashMap的put方法返回值问题

本文详细解析了Java HashMap的put方法,包括其返回值的意义。当插入的键已存在时,put方法返回旧值并覆盖;新键插入则返回null。此外,还介绍了HashMap在键值对冲突时的处理方式,以及在达到一定阈值时如何转换为红黑树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

API文档中的描述:

d29b357b5abf41be03cb9724f9af2880.png

先看一个例子

Map map = new HashMap();

System.out.println(map.put('a', 0)); //null

System.out.println(map.put('a', 1)); //0

System.out.println(map.put('a', 2)); //1

System.out.println(map.put('b', 1)); //null

System.out.println(map.put('b', 2)); //1

System.out.println(map.get('a')); //2

可以看出:put方法的返回值为null或value;

调用put方法时,如果已经存在一个相同的key, 则返回的是前一个key对应的value,同时该key的新value覆盖旧value;

如果是新的一个key,则返回的是null;

通过hashmap的源码可以看出:

map中一个映射不能包含重复的键。每个键最多只能映射一个值。即相同的key在Map中只会有一个与之关联的value存在。

put()方法实现:首先使用hash(key)得到key的hashcode(),hashmap根据获得的hashcode找到要插入的位置所在的链,在这个链里面放的都是hashcode相同的Entry键值对,

在找到这个链之后,会通过equals()方法判断是否已经存在要插入的键值对,而这个equals比较的就是key。

添加对应的key-value这样的键值对node时,如果原本已经存在相同的key,则直接改变对应的value,并返回旧的value;如果不存在相同的key,则插入,在插入链表时,如果链表长度为临界长度TREEIFY_THRESHOLD,再插入任何元素就要变成红黑树。

publicV put(K key, V value) {return putVal(hash(key), key, value, false, true);//put方法调用putVal方法

}/*** Implements Map.put and related methods

*

*@paramhash hash for key

*@paramkey the key

*@paramvalue the value to put

*@paramonlyIfAbsent if true, don't change existing value

*@paramevict if false, the table is in creation mode.

*@returnprevious value, or null if none*/

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,

booleanevict) {

Node[] tab; Node p; intn, i;if ((tab = table) == null || (n = tab.length) == 0)

n= (tab =resize()).length;if ((p = tab[i = (n - 1) & hash]) == null)

tab[i]= newNode(hash, key, value, null);else{

Nodee; K k;if (p.hash == hash &&((k= p.key) == key || (key != null &&key.equals(k))))

e=p;else if (p instanceofTreeNode)

e= ((TreeNode)p).putTreeVal(this, tab, hash, key, value);else{for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {

p.next= newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) //-1 for 1st

treeifyBin(tab, hash);break;

}if (e.hash == hash &&((k= e.key) == key || (key != null &&key.equals(k))))break;

p=e;

}

}if (e != null) { //existing mapping for key//key已经存在

V oldValue = e.value; //将已经存在的结点e的value值赋给oldValue

if (!onlyIfAbsent || oldValue == null)//当onlyIfAbsent为false或者oldValue为null时,进行覆盖操作

e.value = value;//覆盖原结点的value值,用新值替换旧值

afterNodeAccess(e);return oldValue;//返回的是被覆盖的oldValue

}

}++modCount;if (++size >threshold)

resize();

afterNodeInsertion(evict);return null;

}

在hashset中的add方法调用的就是hashmap的put方法,判断put方法的返回值是否等于空,来保证hashset的值不重复。

private transient HashMapmap;/*** Adds the specified element to this set if it is not already present.

* More formally, adds the specified element e to this set if

* this set contains no element e2 such that

* (e==null ? e2==null : e.equals(e2)).

* If this set already contains the element, the call leaves the set

* unchanged and returns false.

*

*@parame element to be added to this set

*@returntrue if this set did not already contain the specified

* element*/

public booleanadd(E e) {return map.put(e, PRESENT)==null;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值