HashMap的put方法返回值问题

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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资金时间价值的计算机应用视频讲解,第八章资金时间价值与方案经济比选20161018讲解.ppt...

第八章资金时间价值与方案经济比选20161018讲解(二)净年值(NAV) 1、含义 净年值也称净年金(记作NAV)&#xff0c;它是把项目寿命期内的净现金流量按设定的折现率折算成与其等值的各年年末的等额净现金流量值。 2&#xff0e;计算 先求该项目的净现值&#xff0c;然后乘以资金回…

[Microsoft][ODBC SQL Server Driver][SQL Server]对象名 ‘***‘无效问题的解决方案器

[Microsoft][ODBC SQL Server Driver][SQL Server]对象名 ***无效问题的解决方案 在用Java进行SQL server数据编程时出现数据库连接成功后对表进行操作时报错“表名无效”。在网上搜了相关问题后均未解决&#xff0c;最后通过在表名前加数据库名的方式得以解决&#xff0c;记录…

Java中将Map转换为JSON

一个注意的地方&#xff1a;要选对jar包 Map map new HashMap();map.put("success", "true");map.put("photoList", photoList);map.put("currentUser", "zhang");//net.sf.json.JSONObject 将Map转换为JSON方法JSONObject…

掌上通计算机一级考试在线安装,计算机一级掌上通

计算机一级掌上通app是一款计算机等级考试学习的软件&#xff0c;让你在线学习计算机的操作知识&#xff0c;便于通过等级考试&#xff0c;快速准确&#xff1b;软件提供海量选择题的题库&#xff0c;随时随地做题&#xff0c;简单又方便&#xff0c;还有计算机基本操作讲解&am…

java获取时间,本周,本月,本季度的起始

package com.yong.util; import java.util.Calendar; import java.util.Date;public class TestDate {public static void main(String[] args) {System.out.println("当前时间&#xff1a;" new Date().toLocaleString());System.out.println("当天0点时间&…

东莞理工学院计算机ccf,中国计算机学会东莞分部成立

为更全面和更好地服务东莞计算机领域专业人士的学术和职业发展&#xff0c;在中国计算机学会(CCF)总部和广州、深圳分部的指导和协助下&#xff0c;由东莞理工学院和中美融易孵化器牵头&#xff0c;联合东莞市各大高校、学会、企业&#xff0c;共同发起成立中国计算机学会东莞分…

mybatis获取表名——mybatis动态调用表名和字段名#{},${}

一直在使用Mybatis这个ORM框架&#xff0c;都是使用mybatis里的一些常用功能。今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示&#xff0c;如某张表的某些字段不让用户查询到。这种情况下&#xff0c;就需要构建sql来动态传入表名、字段…

浙大计算机学院辅导员,浙大博士应聘辅导员被指丢脸 月薪仅1000元

浙江在线05月02日讯 浙江大学动物营养与饲料科学专业博士生冯一秦这两天正在准备博士论文答辩&#xff0c;他已经找好了工作单位——在工商大学当大学生辅导员&#xff0c;一度成为浙大BBS头条新闻——高职低聘&#xff0c;很丢脸吗&#xff1f;网友跟帖&#xff1a;这样的博士…

html5 中 video 标签,H5页面中 video 标签的坑

兼容性差因为是原生组件层级最高iOS系统 和 安卓系统展示方式不一样整理了一些有效的方法关于 标签的 css 样式//全屏按钮video::-webkit-media-controls-fullscreen-button {display: none;}//播放按钮video::-webkit-media-controls-play-button {display: none;}//进度条vid…

男孩读计算机好还是铁路学校好,中专学计算机好还是铁路好?

随着石家庄通用交通学校春季招生火热进行中&#xff0c;有很多同学会在微信上咨询武老师一些学校的问题&#xff0c;比如说选什么专业好&#xff0c;将来哪个专业比较好找工作等等&#xff0c;最近在咨询中&#xff0c;有个同学想学铁路专业也想学计算机专业&#xff0c;就很纠…

谈谈对 Spring 的理解

认识 Spring 框架 Spring 框架是 Java 应用最广的框架&#xff0c;它的成功来源于理念&#xff0c;而不是技术本身&#xff0c;它的理念包括 IoC (Inversion of Control&#xff0c;控制反转) 和 AOP(Aspect Oriented Programming&#xff0c;面向切面编程)。 什么是 Spring&…

计算机与体育教育的关系,体育教学论文:健康教育与体育教育存在的问题研究...

摘要&#xff1a;确立“健康第一”的指导思想,使体育与健康教育相结合,使教育过程与教育目标、手段相统一,是当今世界经济发达国家学校体育工作的共同特点,也是学校体育学科发展的必然。该文通过《体育与健康》课改过程中尚存问题的研究,提出相应的对策,以实现体育教育向素质教…

Spring中@Autowired和@Resource的区别

一、定义 Autowired 对类成员变量、方法及构造函数进行标注&#xff0c;完成自动装配的工作。 Resource 在语义上被定义为通过其唯一的名称来标识特定的目标组件&#xff0c;其中声明的类型与匹配过程无关。 如果没有明确指定名称&#xff0c;则默认名称是从字段名称或设置…

全国计算机考试真考题库4,全国计算机等级考试无纸化真考题库试卷二级C--(4)资料.docx...

精品文档精品文档PAGEPAGE #欢迎下载全国计算机等级考试无纸化真考题库试卷(4)二级 C(考试时间120分钟&#xff0c;满分100分)一、选择题(每小题1分&#xff0c;共40分)(1)下列数据结构中&#xff0c;属于非线性结构的是()。A)循环队列B)带链队列C)二叉树D)带链栈⑵下列数据结构…

Java面试题大全

一、Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;java 开发工具包&#xff0c;提供了 java 的开发环境和运行环境。JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;java 运行环境&#xff0c;为 ja…

每个计算机系的学生都学离散数学,离散数学一阶逻辑精要.ppt

离散数学一阶逻辑精要.ppt2.谓词公式 中量词 的辖域是( ). A. B. C. D. 3.谓词公式 中变元 是( ). A. 自由变元 B. 约束变元 C. 既不是自由变元也不是约束变元 D. 既是自由变元也是约束变元 4.若个体域为整数域&#xff0c;下列公式中真值为1的是 ( ). A. B. C. D. 5. 设A(x):x…

压力测试软件je,Jemeter压力测试工具

![JMeter](https://img.tnblog.net/arcimg/hb/fcfd7c903b184e5e9db56360fed8c7a7.png "JMeter")>#Jemeter 压力测试工具[TOC]JMeter 简介------------>阿帕奇JMeter的?应用程序是开源软件&#xff0c;100&#xff05;纯Java应用而设计的负载测试功能行为和测量…

Java面试题整理(附参考答案)

1、面向对象的特征有哪些方面&#xff1f; 抽象&#xff1a;将同类对象的共同特征提取出来构造类。继承&#xff1a;基于基类创建新类。封装&#xff1a;将数据隐藏起来&#xff0c;对数据的访问只能通过特定接口。多态性&#xff1a;不同子类型对象对相同消息作出不同响应。 …

沈阳药科大学计算机二级好考吗,沈阳药科大学考研难吗?一般要什么水平才可以进入?...

沈阳药科大学考考研难吗&#xff1f;其实并不能一概而论。要看我们每个学生的实际情况。例如&#xff1a;本科院校是哪个层级的&#xff0c;专业考取是否为跨专业&#xff1f;专业是否是热门学科&#xff1f;学校分数线是多少&#xff1f;历年录取人数是多少&#xff1f;接下来…

SpringMVC源码之参数解析绑定原理

SpringMVC源码之参数解析绑定原理 摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前&#xff0c;先来认识一个接口 HandlerMethodArgumentResolver 方法参数解析器接口&#xff0c;这个接口是SpringMVC参数解…