hashmap

java集合框架-HashMap

拈花ヽ惹草 提交于 2020-03-02 22:21:43
JDK1.8前,HashMap底层使用数组和链表结合。首先通过key的hash值判断当前元素存放在数组的位置;如果该位置存在元素,则判断该元素与要存入的元素的hash值以及key是否相同,如果相同直接副高,不同就接到后面形成链表。 JDK1.8后,当一个数组位置的链表长度大于阈值(默认8)时,将链表转化为红黑树,减少搜索时间。 ps:TreeMap、TreeSet以及JDK1.8后的HashMap底层都用到了红黑树。红黑树就是为了解决二叉查找树在某些情况下会退化为线性结构的缺陷。 来源: oschina 链接: https://my.oschina.net/u/3991724/blog/3185425

HashMap中的equals()和hashCode()

ぃ、小莉子 提交于 2020-03-02 20:55:02
HashMap中的equals和hashCode Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀。 为了说明它们的关系,我们需要HashMap的背景知识。 HashMap的存储方式: HashMap的实现方式是数组链, 不同的对象根据其哈希码hashCode方法的返回值)找到对应的数组下标,然后存入数组 。不同的对象有相同的哈希码时怎么办?这就由数组链中的链来解决了,相同哈希码的对象都放在同一条链上,该链的链头指向数组,进而形成数组链。 当第一个对象已经存入HashMap,第二个对象准备存入HashMap时,系统在查找到数组下标后若发现它们的hashCode相同(数组下标相同)(也就是冲突),会调用equals()来检查它们之间的关系,会有相应有以下两种处理方法: 1. 如果相等,系统就不再存入第二个对象; 如果不等,系统视它们为纯粹的下标冲突,将它们放在同一条链上;(拉链桶) 如果它们的hashCode不相同,直接存入第二个对象。 equals()匹配但hashCode()不同:会发生不可预料的事情 现在假设有两个对象,它们的equals()相匹配,但hashCode()却不同

HashMap中的equals()和hashCode()

ぃ、小莉子 提交于 2020-03-02 20:54:56
HashMap中的equals和hashCode Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀。 为了说明它们的关系,我们需要HashMap的背景知识。 HashMap的存储方式: HashMap的实现方式是数组链, 不同的对象根据其哈希码hashCode方法的返回值)找到对应的数组下标,然后存入数组 。不同的对象有相同的哈希码时怎么办?这就由数组链中的链来解决了,相同哈希码的对象都放在同一条链上,该链的链头指向数组,进而形成数组链。 当第一个对象已经存入HashMap,第二个对象准备存入HashMap时,系统在查找到数组下标后若发现它们的hashCode相同(数组下标相同)(也就是冲突),会调用equals()来检查它们之间的关系,会有相应有以下两种处理方法: 1. 如果相等,系统就不再存入第二个对象; 如果不等,系统视它们为纯粹的下标冲突,将它们放在同一条链上;(拉链桶) 如果它们的hashCode不相同,直接存入第二个对象。 equals()匹配但hashCode()不同:会发生不可预料的事情 现在假设有两个对象,它们的equals()相匹配,但hashCode()却不同

HashMap O(1) 复杂度的分析

六月ゝ 毕业季﹏ 提交于 2020-03-02 11:38:27
**C++**在使用STL时,经常混淆的几个数据结构, map,hash Map,unordered_map 事实上,三个容器,有着比较大的区别. Map 内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。 所以复杂度为 O(LogN) Hash map 基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域(桶)进行保存。 插入 得到key, 通过hash函数得到hash值 根据hash值 找到对应的桶号(区域), hash值对(桶数)求模 存放key和value 在对应桶内 取值 分四步: 判断key,根据key算出索引。 根据索引获得索引位置所对应的键值对链表。 遍历键值对链表(当每个桶内只有一个元素时,查找时只进行一次比较),根据key找到对应的Entry键值对。 拿到value。 分析: 以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突

fastjson转换json格式数据为List<HashMap>转换异常问题

给你一囗甜甜゛ 提交于 2020-03-02 08:19:09
在做crm任务分发系统中的【批量修改任务工单的选项】问题时, 需要对接口数据进行处理,接口数据举例如下, [ { "title": "使用情况", "options": [ { "name": "好", "value": 1 }, { "name": "不好", "value": 2 }, { "name": "还行", "value": 3 } ] }, { "title": "优化情况", "options": [ { "name": "好", "value": 1 }, { "name": "不好", "value": 2 }, { "name": "还行", "value": 3 } ] } ] 注意, options 里是个array或者list 。 虽然结构复杂,但是也算清晰。一开始想用JSONArray. parseArray (jsondata , HashMap . class ) ; 转化为以一个List<HashMap>,然后再取得每个HashMap,每个HashMap中又是一个List<HashMap>,然后再遍历取得HashMap。 但是就在第二次遍历list的时候出现了异常, for (HashMap configData : configDataList ){ //这行出错 int value = (Integer)configData.get(

Java中hashMap的源码初探

大城市里の小女人 提交于 2020-03-01 23:58:41
最近一段时间准备沉下心来,认真学习底层的东西。今天从HashMap开始吧。看源码,我个人觉得应该带着问题去看,去学习大师们怎么做的。 {:toc} HashMap 底层是用什么数据结构实现的? HashMap 怎么扩容? HashMap 怎么解决Key冲突? HashMap 是线程安全的吗? HashMap 是怎么把数据均匀的分布到容器的? HashMap 底层是用什么数据结构实现的? 我们先来看看,HashMap实现类定义的变量: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final int MAXIMUM_CAPACITY = 1 << 30; static final float DEFAULT_LOAD_FACTOR = 0.75f; static final Entry<?,?>[] EMPTY_TABLE = {}; transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE; transient int size; int threshold; final float loadFactor; transient int modCount; static final int ALTERNATIVE_HASHING

HashMap原理分析及性能优化

╄→гoц情女王★ 提交于 2020-03-01 22:17:36
文章目录 一.HashMap是什么 二.HashMap继承类对比分析 三.HashMap源码相关单词含义 四.HashMap如何确定哈希桶数组索引位置 五. HashMap 的 put 方法分析 六.HashMap扩容机制 七.HashMap线程安全性 一.HashMap是什么 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。 HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。 这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。 数据结构(JDK1.8): Node<K,V>[] table; 数组+链表+红黑树 二.HashMap继承类对比分析 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap、Hashtable、LinkedHashMap和TreeMap , 类继承关系如下图所示: ① HashMap :它 根据键的hashCode值存储数据 ,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。 HashMap非线程安全 ,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致

Java编程的逻辑 (40) - 剖析HashMap

淺唱寂寞╮ 提交于 2020-03-01 16:19:38
前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用?是如何实现的?本节详细介绍。 字面上看,HashMap由两个单词组成,Hash和Map,这里Map不是地图的意思,而是表示映射关系,是一个接口,实现Map接口有多种方式,HashMap实现的方式利用了Hash。 下面,我们先来看Map接口,接着看如何使用HashMap,然后看实现原理,最后我们总结分析HashMap的特点。 Map接口 基本概念 Map有键和值的概念,一个键映射到一个值,Map按照键存储和访问值,键不能重复,即一个键只会存储一份,给同一个键重复设值会覆盖原来的值。使用Map可以方便地处理需要根据键访问对象的场景,比如: 一个词典应用,键可以为单词,值可以为单词信息类,包括含义、发音、例句等。 统计和记录一本书中所有单词出现的次数,可以以单词为键,出现次数为值。 管理配置文件中的配置项,配置项是典型的键值对。 根据身份证号查询人员信息,身份证号为键,人员信息为值。 数组、ArrayList、LinkedList可以视为一种特殊的Map,键为索引,值为对象。 接口定义 Map接口的定义为: public interface Map<K,V> { V put(K key, V

Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例

巧了我就是萌 提交于 2020-03-01 09:52:21
概要 这一章,我们对HashSet进行学习。 我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet。内容包括: 第1部分 HashSet介绍 第2部分 HashSet数据结构 第3部分 HashSet源码解析(基于JDK1.6.0_45) 第4部分 HashSet遍历方式 第5部分 HashSet示例 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3311252.html 第1部分 HashSet介绍 HashSet 简介 HashSet 是一个 没有重复元素的集合 。 它是由HashMap实现的, 不保证元素的顺序 ,而且 HashSet允许使用 null 元素 。 HashSet是 非同步的 。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问: Set s = Collections.synchronizedSet(new HashSet(...)); HashSet通过iterator()返回的

HashMap和ConcurrentHashMap

大城市里の小女人 提交于 2020-03-01 09:36:03
目录 HashMap Java7中HashMap(数组+单向链表) ​ Java8中的HashMap(数组+链表+红黑树) ConcurrentHashMap Java7中的ConcurrentHashMap Java8中的ConcurrentHashMap(引入红黑树) HashMap HashMap 根据键的 hashCode 值存储数据 ,大多数情况下可以直接定位到它的值,因而具有很快 的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null ,允许多条记 录的值为 null。 HashMap 非线程安全 ,即任一时刻可以有多个线程同时写 HashMap,可能会导 致数据的不一致。 如果需要满足线程安全, 可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力 ,或者 使用 ConcurrentHashMap 。 Java7中HashMap(数组+单向链表) 大方向上, HashMap 里面是一个 数组 ,然后数组中每个元素是一个 单向链表 。上图中,每个绿色 的实体是嵌套类 Entry 的实例, Entry 包含四个属性: key, value, hash 值和用于单向链表的 next 。 1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。