关于HashMap中put和putForCreate方法的区别

慕容天河 2017-03-01 10:27:28
put方法源码:

1 public V put(K key, V value) {
2 if (key == null)
3 return putForNullKey(value);
4 int hash = hash(key.hashCode());
5 int i = indexFor(hash, table.length);
6 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
7 Object k;
8 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
9 V oldValue = e.value;
10 e.value = value;
11 e.recordAccess(this);
12 return oldValue;
13 }
14 }
15
16 modCount++;
17 addEntry(hash, key, value, i);
18 return null;
19 }

putForCreate方法源码:

1 private void putForCreate(K key, V value) {
2 int hash = (key == null) ? 0 : hash(key.hashCode());
3 int i = indexFor(hash, table.length);
4 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
5 Object k;
6 if (e.hash == hash &&
7 ((k = e.key) == key || (key != null && key.equals(k)))) {
8 e.value = value;
9 return;
10 }
11 }
12 createEntry(hash, key, value, i);
13 }

感觉这两个方法实现的功能是一样的啊,都是插入对象。为什么要写两个不同的方法啊 。 还有下边这个putAllForCreate方法,为什么调用的是putForCreate方法而不是put方法

1 private void putAllForCreate(Map<? extends K, ? extends V> m) {
2 for (Iterator<? extends Map.Entry<? extends K, ? extends V>> i = m.entrySet().iterator(); i.hasNext(); ) {
3 Map.Entry<? extends K, ? extends V> e = i.next();
4 putForCreate(e.getKey(), e.getValue());
5 }
6 }
...全文
198 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程真香 2020-10-15
  • 打赏
  • 举报
回复
putForCreate() 方法只是提供给 反序列化(readObject())和克隆时才会使用clone(),之所以在这两种情况下使用putForCreate()是因为反序列化和克隆的时候是将已经完成的map进行反序列化和克隆,简单地说就是已经知道要添加元素的新map需要多大的空间,而且也已经通过inflateTable()方法申请了空间,就不需要使用put方法了,这是因为put方法会调用addEntry方法,而addEntry方法需要判断是否需要resize()也就是重构,而putForCreate不需要进行判断是否需要扩容(因为需要多大的空间是知道的,而且已经申请好了,不会出现size超过阈值的情况),所以putForCreate直接调用createEntry进行添加就好了。 PS:没事多看看源码就都明白了。
李德胜1995 2017-03-01
  • 打赏
  • 举报
回复
put外界添加元素使用,putForCreate内部构造器使用

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧