浅谈java中HashMap键的比较方式
先看一个例子
Integer integer=12344; Integer integer1=12344;
在Java中Integer 和Integer1是不相等的,但是如果再执行如下语句
map.put(integer, 1); map.put(integer1, 2);
会发现2会把1覆盖,问题来了,明明是两个不同的对象,为什么,2会把1覆盖呢?
我们看HashMap中添加键的源代码,如下
可以发现我们传进来的键交给了一个hash的成员方法区处理,这里我们看看hash方法的源码
哦,看到这里明白了,我们传进来的键会执行hashCode方法,那么到这里我们明白了,原来,HashMap判断两个键是否相等是看他们的hashCode
是否相等,
那我们看看上面说的integer和integer1的hashCode是否相等
这里发现是相等的,都是12344,所以我们可以很轻易的得出结论integer和integer1代表的是同一个键~,(这个结论是错的,继续往下看)
到这里还有一个问题,hashCode相等的两个对象他们的键一定是相同的吗?
先说答案不是,为什么呢?
来,我再举一个例子,先定义两个字符串name,name1
然后输出他们的hashCode值
可以看出,这两个不同的字符串拥有相同的hashCode值,
那么我们执行如下代码
看看他的输出结果
嗯?怎么会这样?我们定义的两个字符串明明hashCode值相同,按理来说,他们在HashMap中应该是同一个键才对,为什么会是两个不同的键?
我们再回过头看HashMap中的put方法
发现他调用了一个叫putVal得方法我们点进去看看
看到这里我们明白了,为什么name和name1hashCode值相同却是两个不同的键,因为他们进行equals比较的时候不同呀,name是"通话",name1是"重地",equals方法不同,自然就是同的键,
至于我们一开始举的例子,integer和integer1,他们先进行了hashCode比较,相同后再进行,equals比较,再相同才判定他们是同一个键;
这也是我们为什么常常说,为什么重写equals还要重写hashcode,这两者缺一不可
到此这篇关于浅谈java中HashMap键的比较方式的文章就介绍到这了,更多相关java HashMap键内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
Java源码解析之HashMap的put、resize方法详解
一.HashMap 简介 HashMap 底层采用哈希表结构 数组加链表加红黑树实现,允许储存null键和null值 数组优点:通过数组下标可以快速实现对数组元素的访问,效率高 链表优点:插入或删除数据不需要移动元素,只需要修改节点引用效率高 二.源码分析 2.1 继承和实现 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
-
关于Java HashMap自动排序的简单剖析
1.HashMap概述 HashMap是无序的,这里无序的意思是你取出数据的顺序与你存入数据的顺序不同 2.发现问题 当尝试向HashMap中存入int类型的key,可以看到在输出的时候会自动排序 HashMap<Integer, String> map = new HashMap<>(); map.put(3, "asdf"); map.put(2, "asdf"); map.put(1, "asdf"); map.pu
-
Java LinkedHashMap 底层实现原理分析
在实现上,LinkedHashMap很多方法直接继承自HashMap,仅为维护双向链表覆写了部分方法.所以,要看懂 LinkedHashMap 的源码,需要先看懂 HashMap 的源码. 默认情况下,LinkedHashMap的迭代顺序是按照插入节点的顺序.也可以通过改变accessOrder参数的值,使得其遍历顺序按照访问顺序输出. 这里我们只讨论LinkedHashMap和HashMap的不同之处,LinkedHashMap的其他操作和特性具体请参考HashMap 我们先来看下两者的区别:
-
Java HashSet(散列集),HashMap(散列映射)的简单介绍
简介 本篇将简单讲解Java集合框架中的HashSet与HashMap. 散列集(HashSet) 快速入门 底层原理:动态数组加单向链表或红黑树.JDK 1.8之后,当链表长度超过阈值8时,链表将转换为红黑树. 查阅HashSet的源码,可以看到HashSet的底层是HashMap,HashSet相当于只用了HashMap键Key的部分,当需要进行添加元素操作时,其值Value始终为常量PRESENT = new Object().以下为HashSet的代码片段: private transi
-
详解 Java HashMap 实现原理
HashMap 是 Java 中最常见数据结构之一,它能够在 O(1) 时间复杂度存储键值对和根据键值读取值操作.本文将分析其内部实现原理(基于 jdk1.8.0_231). 数据结构 HashMap 是基于哈希值的一种映射,所谓映射,即可以根据 key 获取到相应的 value.例如:数组是一种的映射,根据下标能够取到值.不过相对于数组,HashMap 占用的存储空间更小,复杂度却同样为 O(1). HashMap 内部定义了一排"桶",用一个叫 table 的 Node 数组表示:
-
JAVA中哈希表HashMap的深入学习
深入浅出学Java--HashMap 哈希表(hash table) 也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中HashMap的实现原理进行讲解,并对JDK7的HashMap源码进行分析. 一.什么是哈希表 在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能 数组:采用一段连续的存储单元来存储数据.对于指定下标的查找,时间复杂度为O(1):通过给定值进
-
浅谈Java源码ConcurrentHashMap
一.记录形式 打算直接把过程写在源码中,会按序进行注释,查阅的时候可以按序号只看注释部分 二.ConcurrentHashMap 直接模拟该类的使用过程,从而一步步看其怎么运作的吧,当然最好还是带着问题一遍思考一遍总结会比较好,我阅读源码的时候带着以下几个问题 并发体现在哪里?怎么保证线程安全的 怎么扩容的?扩容是怎么保证线程安全的? 怎么put的?put是怎么保证线程安全的? 用了哪些锁?这些锁的作用是什么? 需要留意哪些关键点? 我们最简单地使用方法是怎么样的? new一个Concurren
-
Java中HashMap里面key为null存放到哪
我们知道HashMap集合是允许存放null值的 hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢? 在put方法里头,其实第一行就处理了key=null的情况. // HashMap的put方法 public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) // key为null调用putForNull
-
Java 对HashMap进行排序的三种常见方法
首先来看看Map集合获取元素的三种常见方法keySet().values().entrySet() 1. values(): 返回map集合的所有value的Collection集合(于集合中无序存放) import java.util.*; public class Main{ public static void main(String[] args){ Map<String, String> map = new HashMap<String, String>(); //构建键
-
Java HashMap源码及并发环境常见问题解决
HashMap源码简单分析: 1 一切需要从HashMap属性字段说起: /** The default initial capacity - MUST be a power of two. 初始容量 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity, used if a higher value is implicitly specified * by eit
-
解决Java Redis删除HashMap中的key踩到的坑
现象 Java使用Redis删除HashMap中的key时,取出对应的HashMap后通过Java中HashMap的remove方法移除key然后重新调用redis的Hmset方法将覆盖无效 示例代码 //通过key取出对应的HashMap Map<String, String> ruleMap = jedisCluster.hgetAll("HashKey"); //通过java中移除HashMap中的Key ruleMap.remove("ruleA"
-
java中JSONObject转换为HashMap(方法+main方法调用实例)
1.首先要导入json相关的jar包 引入的jar包: (版本自行定义,可以选用使用人数偏多的版本,这样比较稳定) commons-beanutils-1.9.2.jar commons-collections-3.2.1.jar commons-lang-2.6.jar commons-logging-1.2.jar ezmorph-1.0.6.jar json-lib-2.4-jdk15.jar jar包的下载可以去下面这个网址搜索: https://mvnrepository.com/ 2
-
JAVA核心知识之ConcurrentHashMap源码分析
1 前言 ConcurrentHashMap是基于Hash表的Map接口实现,键与值均不允许为NULL,他是一个线程安全的Map.同时他也是一个无序的Map,不同时间进行遍历可能会得到不同的顺序.在JDK1.8之前,ConcurrentHashMap使用分段锁以在保证线程安全的同时获得更大的效率.JDK1.8开始舍弃了分段锁,使用自旋+CAS+sync关键字来实现同步.本文所述便是基于JDK1.8. ConcurrentHashMap与HashMap有共同之处,一些HashMap的基本概念与实现
-
Java7和Java8中的ConcurrentHashMap原理解析
Java7 中 ConcurrentHashMap ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些. 整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表"部分"或"一段"的意思,所以很多地方都会将其描述为分段锁.注意,行文中,我很多地方用了"槽"来代表一个 segment. 简单理解就是,ConcurrentHashMap 是一个 Segm
-
Java HashMap实现原理分析(一)
从本文开始,介绍一下最常用的一个集合对象HashMap,HashMap存储的是键值对,本文采用的基于JDK11的源码实现. 一般大家都知道HashMap是通过put操作把一组键值对(key和value)存储到HashMap中,然后可以通过get(key)去获取key对应的value.而最重要的这两个过程是怎么实现的呢?下面我们就来对put和get这两个过程做一个分析. HashMap基本工作原理 下面先看一段源码: /** * The table, initialized on first us
-
java使用HashMap实现斗地主(有序版)
本文实例为大家分享了java使用HashMap实现斗地主的具体代码,供大家参考,具体内容如下 案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 案例分析 1.准备牌: 每张扑克牌牌由花色和数字两部分组成.可以使用花色集合与数字集合嵌套迭代完成扑克牌的组装. 2.发牌 扑克牌组转完毕后由Collections类的shuffle方法打乱重排,最后3张当作底牌,剩余牌通过对3取模依次发牌. 3.看牌 打
-
Java中使用HashMap改进查找性能的步骤
Java中,HashMap,其实就是键值对.一个Key,对应一个值:写数据时,指定Key写对应值:读取时凭Key找到相应值.感觉就跟Redis差不多. // 创建 HashMap 对象 Sites HashMap<Integer, String> Sites = new HashMap<Integer, String>(); // 添加键值对 Sites.put(1, "Google"); Sites.put(2, "Runoob"); Si
-
Java ConcurrentHashMap的使用示例
构造方法 // 1.无参数构造方法 new ConcurrentHashMap(); // 2.指定初始容量 new ConcurrentHashMap(initialCapacity) // 3.指定初始容量和加载因子 new ConcurrentHashMap(initialCapacity,loadFactor) // 4.指定初始容量和加载因子与并发级别(并发更新线程数) new ConcurrentHashMap(initialCapacity, loadFactor, concurr
随机推荐
- EXECUTE IMMEDIATE用法小结
- vue动态生成dom并且自动绑定事件
- Angularjs CURD 详解及实例代码
- C#中的正则表达式 学习资料
- php实现给图片加灰色半透明效果的方法
- PHP实现的常规正则验证helper公共类完整实例
- PHP获取当前页面完整URL的实现代码
- JavaScript高级程序设计 错误处理与调试学习笔记
- js封装成插件的步骤方法
- JS代码格式化和语法着色V2
- Linux 集群技术
- jQuery判断一个元素是否可见的方法
- 10款非常有用的 Ajax 插件分享
- 基于Jquery实现键盘按键监听
- 简单采集了yahoo的一些数据
- Java面向对象编程中final关键字的使用方法详解
- Python实现句子翻译功能
- Laravel中简约却不简单的Macroable宏指令详解
- bash脚本中将密码传递给ssh/scp命令方法详解
- 详解java如何正确使用volatile