API文档中的描述:

先看一个例子

Map<Character, Integer> map = new HashMap<Character, Integer>();
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,再插入任何元素就要变成红黑树。

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);//put方法调用putVal方法}/*** Implements Map.put and related methods** @param hash hash for key* @param key the key* @param value the value to put* @param onlyIfAbsent if true, don't change existing value* @param evict if false, the table is in creation mode.* @return previous value, or null if none*/final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, 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 {Node<K,V> e; K k;if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode<K,V>)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 1sttreeifyBin(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值赋给oldValueif (!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 HashMap<E,Object> map;/*** Adds the specified element to this set if it is not already present.* More formally, adds the specified element <tt>e</tt> to this set if* this set contains no element <tt>e2</tt> such that* <tt>(e==null ? e2==null : e.equals(e2))</tt>.* If this set already contains the element, the call leaves the set* unchanged and returns <tt>false</tt>.** @param e element to be added to this set* @return <tt>true</tt> if this set did not already contain the specified* element*/public boolean add(E e) {return map.put(e, PRESENT)==null;}

HashMap的put方法返回值问题相关推荐

  1. SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器

    SpringMVC入门(二)-- 参数的传递.Controller方法返回值.json数据交互.异常处理.图片上传.拦截器 参考文章: (1)SpringMVC入门(二)-- 参数的传递.Contro ...

  2. 【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )

    文章目录 一.使用 for 循环遍历集合 二.使用 each 方法遍历集合 三.集合的 each 方法返回值分析 四.完整代码示例 一.使用 for 循环遍历集合 使用 for 循环 , 遍历集合 , ...

  3. .net mvc actionresult 返回字符串_072-SpringMVC后端控制器接收参数、处理器方法返回值类型、拦截器、文件上传下载...

    1. 注解式开发之annotation-driven解释 (1) mvc注解驱动在哪个文件中配置? 在springmvc中配置 (2) 配置mvc注解驱动使用哪个标签? 2. 注解式开发之视图解析器 ...

  4. 父类作为方法的形参以及父类作为方法返回值

    1.父类作为方法的形参 语句:修饰符 父类类型 方法名(){} 2.父类作为方法返回值 语句:修饰符 void/返回值类型 方法名(父类类型 形参名){} 代码例子: 动物类: /*** @autho ...

  5. C# 方法返回值的个数

    方法返回值类型总的来说分为值类型,引用类型,Void 有些方法显示的标出返回值 public int Add(int a,int b) {return a+b; } 有些方法隐式的返回返回值,我们可以 ...

  6. IXMLDOMDocument中的load方法返回值有BUG

    IXMLDOMDocument中的load方法返回值是否有BUG IXMLDOMDocument中load一个xml文件时,返回值和msdn上说的不符 MSDN上说的是: Return Values ...

  7. JAVA中返回值为字母时_LeetCode#524通过删除字母匹配到字典里最长单词-java中CompareTo方法用法以及Comparator中Compare方法返回值...

    import java.util.Collections; import java.util.Comparator; import java.util.List; /* 524. 通过删除字母匹配到字 ...

  8. SpringMVC控制类的Controller方法返回值

    SpringMVC控制类的Controller方法返回值 Controller方法返回值 返回字符串 逻辑视图名 controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址 ...

  9. 集合中的compare方法返回值说明

    compare()方法,有两个参数自定义为 o1 和 o2,默认返回 0,可修改方法体中的内容,返回不同的参数值(整型) o1待比较的参数,o2与其比较的参数,即之前已经排序好的数组或集合的最后一个元 ...

最新文章

  1. Django(二)模板系统
  2. jquery删除数组中的某个元素下标越界_Java数据结构和算法(二)—数组
  3. 惠普打印机换硒鼓图解_佳能2900打印机硒鼓加粉图解教程,旅行诗人俊仔拆硒鼓加粉系列2...
  4. 快速实现word、excel、ppt、txt等办公文件在线预览功能(Java版)
  5. 卷积神经网络(CNN)之卷积层的实现
  6. 关于mapper接口与mapper.xml文件在同包运行找不到问题解决
  7. python求解LeetCode题目,找出数组中的Majority element元素
  8. delphi利用bing翻译API做的多国语言翻译软件
  9. dwg格式的计算机图,看图纸(DWG文件浏览器)
  10. 5G O-RAN 一体式小基站硬件白盒化的参考架构
  11. 2021-2027全球与中国弹簧加载探针市场现状及未来发展趋势
  12. CC2430 串口使用详解
  13. 汉洛塔 简单算法(c和python)
  14. 喝酒骑行电瓶车属于违法或者犯罪吗?
  15. CPU 已不足以驱动屏幕指纹识别技术,于是 vivo 用 DSP 来加速
  16. 每日新闻简报 每天三分钟,知晓天下事 一句话新闻早餐
  17. Dart Sass替换Node Sass
  18. SQL Server over()
  19. Dubbo线程池耗尽问题
  20. java大数据量调优(超赞值得收藏)

热门文章

  1. 单链表删除整表_单链表删除
  2. 如何卸载非linux系统分区,如何卸载Linux系统分区?卸载Linux系统分区的方法-站长资讯中心...
  3. sql2008能否打开mysql数据库_mysql数据库数据能不能导入到sql server中
  4. git master主分支_Git分支管理策略及简单操作
  5. qaxwidget传递参数到html,记一次QT使用QAxWidget打开.html文件调用显示离线百度地图不能缩放,自定义图片不能显示解决方法...
  6. 定时器mia是什么意思_MIA的完整形式是什么?
  7. 一个类可以有一个接口,接口可以有一个Java类吗?
  8. 「递归」的正确打开方式,看不懂你打我~
  9. 几款浏览器JavaScript调试工具
  10. memoryTraining记忆训练小游戏