hashmap

Java中HashMap遍历的两种方式

笑着哭i 提交于 2020-03-21 08:10:30
[转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种:  Map map = new HashMap();  Iterator iter = map.entrySet().iterator();  while (iter.hasNext()) {  Map.Entry entry = (Map.Entry) iter.next();  Object key = entry.getKey();  Object val = entry.getValue();  }  效率高,以后一定要使用此种方式!第二种:  Map map = new HashMap();  Iterator iter = map.keySet().iterator();  while (iter.hasNext()) {  Object key = iter.next();  Object val = map.get(key);  }  效率低,以后尽量少使用! HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:  public class HashMapTest {  public static void main(String

Java面试题之HashSet 的实现原理?

雨燕双飞 提交于 2020-03-20 05:05:03
HashSet 的实现原理? 首先,我们需要知道它是Set的一个实现,所以保证了当中没有重复的元素。 一方面Set中最重要的一个操作就是查找。而且通常我们会选择 HashSet来实现,因为它专门对快速查找进行了优化。 HashSet使用的是散列函数,那么它当中的元素也就无序可寻。当中是允许元素为null的。 先对实现原理进行一个总结: (1)基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。 (2)当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的equals(Object obj)方法和 hashCode() 方法很重要,而且这两个方法的返回值必须保持一致:当该类的两个的 hashCode() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。通常来说,所有参与计算 hashCode() 返回值的关键属性,都应该用于作为 equals() 比较的标准。 (3

map vs switch performance in go

拟墨画扇 提交于 2020-03-19 02:23:09
问题 Consider this benchmark, where we compare map access vs switch var code = []int32{0, 10, 100, 100, 0, 10, 0, 10, 100, 14, 1000, 100, 1000, 0, 0, 10, 100, 1000, 10, 0, 1000, 12} var mapCode = map[int32]int32{ 0: 1, 10: 2, 100: 3, 1000: 4, } func BenchmarkMap(b *testing.B) { success := int32(0) fail := int32(0) for n := 0; n < b.N; n++ { // for each value in code array, do a specific action for _, v := range code { c, ok := mapCode[v] if !ok { fail++ } else { success += c } } } } func

JAVA基础知识复习

£可爱£侵袭症+ 提交于 2020-03-18 19:31:48
Java基础 1、String类为什么是final的。 2、HashMap的源码,实现原理,底层结构。 3、说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。 4、描述一下ArrayList和LinkedList各自实现和区别 5、Java中的队列都有哪些,有什么区别。 6、反射中,Class.forName和classloader的区别 7、Java7、Java8的新特性(baidu问的,好BT) 8、Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高 9、Java内存泄露的问题调查定位:jmap,jstack的使用等等 10、string、stringbuilder、stringbuffer区别 11、hashtable和hashmap的区别 13、异常的结构,运行时异常和非运行时异常,各举个例子 14、String a= “abc” String b = "abc" String c = new String("abc") String d = "ab" + "c" .他们之间用 == 比较的结果 15、String 类的常用方法 16、Java 的引用类型有哪几种 17、抽象类和接口的区别 18、java的基础类型和字节大小。 19、Hashtable,HashMap

集合框架系列 Map(十一):LinkeHashMap

a 夏天 提交于 2020-03-18 18:31:25
目录 1 概述 2 原理 3 源码分析  3.0 Entry 的继承体系  3.1 链表的建立过程  3.2 链表节点的删除过程  3.3 访问顺序的维护过程  3.4 基于 LinkedHashMap 实现缓存 4 总结 1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该特性很有用,比如缓存。在实现上,LinkedHashMap 很多方法直接继承自 HashMap,仅为维护双向链表覆写了部分方法。所以,要看懂 LinkedHashMap 的源码,需要先看懂 HashMap 的源码。关于 HashMap 的源码分析,本文并不打算展开讲了。大家可以参考我之前的一篇文章“ HashMap 源码详细分析(JDK1.8) ”。在那篇文章中,我配了十多张图帮助大家学习 HashMap 源码。 本篇文章的结构与我之前两篇关于 Java 集合类( 集合框架 )的源码分析文章不同,本文将不再分析集合类的基本操作(查找、遍历、插入、删除),而是把重点放在双向链表的维护上。包括链表的建立过程,删除节点的过程,以及访问顺序维护的过程等。好了,接下里开始分析吧。 2. 原理 上一章说了

集合框架系列 Map(十):HashMap

柔情痞子 提交于 2020-03-18 18:17:13
目录 1 概述 2 原理 3 源码分析  3.1 构造方法   3.1.1 构造方法分析   3.1.2 初始容量、负载因子、阈值  3.2 查找  3.3 遍历  3.4 插入   3.4.1 插入逻辑分析   3.4.2 扩容机制   3.4.3 链表树化、红黑树链化与拆分  3.5 删除  3.6 其他细节  3.7 总结 1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap 。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是非线程安全类,在多线程环境下可能会存在问题。 在本篇文章中,我将会对 HashMap 中常用方法、重要属性及相关方法进行分析。需要说明的是,HashMap 源码中可分析的点很多,本文很难一一覆盖,请见谅。 2. 原理 上一节说到 HashMap 底层是基于散列算法实现,散列算法分为散列再探测和拉链式。HashMap 则使用了拉链式的散列算法,并在 JDK 1.8 中引入了红黑树优化过长的链表。数据结构示意图如下: 对于拉链式的散列算法,其数据结构是由数组和链表(或树形结构)组成

HashMap为什么是线程不安全的

こ雲淡風輕ζ 提交于 2020-03-18 18:03:59
3 月,跳不动了?>>> HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/3197585

HashMap底层源码剖析

十年热恋 提交于 2020-03-17 19:17:23
HashMap底层源码剖析 数组+单向链表+红黑树 数组:    数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:    当法神hash碰撞时,首先会找到数组对应位置,然后1.8采用尾插入法(1.7采用头插入法),形成一个单项链表结构 红黑树:   当数组中每项的链表长度大于8时,会转换为红黑树 什么是hash碰撞?解决方案 hash碰撞:    不同的key可能会产生相同的hash值; 方案:    链表发,再哈希法; hashMap中采用链表发,在ConcurrentHashMap中采用哈希法; 为什么采用红黑树,比如二叉查找树,并且为什么临界值为8    二叉查找树在特殊情况下也会变为线性结构,和原来链表有共同的问题,节点太深,查找性能慢 使用红黑树主要用于提升查询速度,红黑树是平衡二叉树的一种,插入新的数据都会通过左旋,右旋,变色等操作来保持平衡,解决节点的深度问题   当数据较少时,采用链表要比红黑树效率高,因为平衡二叉树保持平衡需要耗费资源,那么前期数据较少时采用链表,当数据到达一定的界限后,再采用 红黑树,可以加快数据查询速度,官方测试8为性能最优 put()底层源码剖析 public V put(K key, V value) { return putVal(hash(key), key, value, false, true);     } /**

HashMap底层源码与实现逻辑

依然范特西╮ 提交于 2020-03-17 19:02:20
ConcurrentHashMap性能高于HashTable,都能够完成线程安全操作, Hashtable中线程安全使用synchronized同步方法进行加锁操作,如果当前一个线程正在访问该集合,其他线程是无法进行访问的,需要进行等待 反之ConcurrentHashMap当中采用分段锁机制 JDK1.7和JDK1.8底层实现的区别 JDK1.8版本之前,ConcurrentHashMap使用分段锁技术,将数据分成一段一段的进行村粗,每一个数据段配置一把锁Segment(继承ReentrantLock) 底层采用:Segment+HashEntry 当数据添加时,根据key值找到Segment对应的数据段,然后匹配数据块,采用链表方式进行存储 1.1JDK1.7底层实现 在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成: Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样 1.2JDK1.8底层实现 JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现

Map集合

社会主义新天地 提交于 2020-03-17 11:04:49
Map集合概述    存储键值对应关系的数据,也就是映射关系。 Map集合特点   Map 集合中不能存在相同的键,一个键只能对应一个值,键相同值覆盖。   Map 集合的数据结构 只跟键有关 ,跟值无关。   基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。 了解Map集合,Map集合有哪些实现 hashMap hashTable LinkedHashMap TreeMap ConcurrentHashMap HashMap和HashTable的区别    HashMap不是线程安全的,HashTable是线程安全的一个Collection。   HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。   HashMap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。   HashMap允许null key和null value,而hashtable不允许。   HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable