hashmap

ConcurrentHashMap总结

不羁岁月 提交于 2020-04-17 03:25:23
【推荐阅读】微服务还能火多久?>>> 并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,无论对于Java并发编程的学习还是Java内存模型的理解,ConcurrentHashMap的设计以及源码都值得非常仔细的阅读与揣摩。 这篇日志记录了自己对ConcurrentHashMap的一些总结,由于JDK6,7,8中实现都不同,需要分开阐述在不同版本中的ConcurrentHashMap。 之前已经在 ConcurrentHashMap原理分析 中解释了ConcurrentHashMap的原理,主要是从代码的角度来阐述是源码是如何写的,本文仍然从源码出发,挑选个人觉得重要的点(会用红色标注)再次进行回顾,以及阐述ConcurrentHashMap的一些注意点。 1. JDK6与JDK7中的实现 1.1 设计思路 ConcurrentHashMap采用了 分段锁 的设计

Remove all entries from HashMap where value is NOT what I'm looking for

只愿长相守 提交于 2020-04-11 11:49:47
问题 The title question summarizes it nicely, but assume I am coding in Java and have a HashMap that looks something like this (it has a lot more entries obviously): Map<String, Integer> myMap = new HashMap<>(); myMap.put{"a", 1} myMap.put{"b", 2} myMap.put{"c", 2} myMap.put{"d", 3} Now I don't like entries with the value of 2, so I want to remove them all as effectively as possible, leaving me only with the entries that have value 1 or 3. It should look as if my map was instead made like this:

Remove all entries from HashMap where value is NOT what I'm looking for

六月ゝ 毕业季﹏ 提交于 2020-04-11 11:47:51
问题 The title question summarizes it nicely, but assume I am coding in Java and have a HashMap that looks something like this (it has a lot more entries obviously): Map<String, Integer> myMap = new HashMap<>(); myMap.put{"a", 1} myMap.put{"b", 2} myMap.put{"c", 2} myMap.put{"d", 3} Now I don't like entries with the value of 2, so I want to remove them all as effectively as possible, leaving me only with the entries that have value 1 or 3. It should look as if my map was instead made like this:

Java HashMap array size

你。 提交于 2020-04-11 05:45:13
问题 I am reading the implementation details of Java 8 HashMap, can anyone let me know why Java HashMap initial array size is 16 specifically? What is so special about 16? And why is it the power of two always? Thanks 回答1: The reason why powers of 2 appear everywhere is because when expressing numbers in binary (as they are in circuits), certain math operations on powers of 2 are simpler and faster to perform (just think about how easy math with powers of 10 are with the decimal system we use).

Java HashMap resizing

不羁的心 提交于 2020-04-10 08:13:38
问题 Let's assume we have some code class WrongHashCode{ public int code=0; @Override public int hashCode(){ return code; } } public class Rehashing { public static void main(String[] args) { //Initial capacity is 2 and load factor 75% HashMap<WrongHashCode,String> hashMap=new HashMap<>(2,0.75f); WrongHashCode wrongHashCode=new WrongHashCode(); //put object to be lost hashMap.put(wrongHashCode,"Test1"); //Change hashcode of same Key object wrongHashCode.code++; //Resizing hashMap involved 'cause

JDK源码笔记-java.util.HashMap

大兔子大兔子 提交于 2020-04-09 20:49:14
HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: Java代码 HashMap<String , Double> map = new HashMap<String , Double>(); map.put("语文" , 80.0); map.put("数学" , 89.0); map.put("英语" , 78.2); HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。 当程序执行 map.put("语文" , 80.0); 时,系统将调用"语文"的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。 我们可以看 HashMap 类的 put(K key , V value) 方法的源代码: public V put(K key, V value) { // 如果 key 为 null,调用 putForNullKey 方法进行处理 if (key == null) return putForNullKey(value); // 根据 key 的 keyCode 计算 Hash 值 int

java学习-hashMap和linkedHashMap

自闭症网瘾萝莉.ら 提交于 2020-04-08 11:01:48
1、hashMap和linkedHashMap和treeMap * LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。 * HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。 * 如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。 * LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。 * LinkedHashMap是线程不安全的。   hashMap示例 //无序 Map<String,String> hashMap = new HashMap<>(); hashMap.put("No1","小明1"); hashMap.put("No2","小明2"); hashMap.put("No3","小明3"); System.out.println("hashMap=>" + hashMap); linkedHashMap示例 // 有序,线程不安全,双向链表 // LinkedHashMap默认的构造参数是默认按照插入顺序的,就是说你插入的是什么顺序,读出来的就是什么顺序, 但是也有访问顺序,就是说你访问了一个key,这个key就跑到了最后面 //

Java HashMap源码详解

夙愿已清 提交于 2020-04-08 01:30:17
Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 HashMap 组成结构 1.2.1 Hashmap底层数据结构 2.HashMap源码解析 2.1 HashMap属性源码解析 2.1.1 HashMap中的静态常量 2.1.2 HashMap中的属性 2.1.2 HashMap中的存储结点 2.1.3 Hash表 2.2 方法源码分析 2.2.1 构造方法分析 2.2.2 Put(K key,V value) 待续... 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做 Entry ,有着key与value两个基本属性以及有其他的包含其他结点位置信息的属性 通过HashMap我们可以存储键值对,并且可以在较短的时间复杂度内, 1.1.2 HashMap继承图 HashMap通过继承 AbstractMap 实现了 Map 接口,且本身也实现了 Map 接口 在接口实现关系上来看为多余操作 但有一点要注意,在使用 反射获取实现接口 时,如果不是显示实现某接口而是通过继承来实现该接口,则不会获取该接口类型,这一点在使用

Using a key to map to a range of values. Letter Grade to exam score example [duplicate]

时间秒杀一切 提交于 2020-04-07 02:21:08
问题 This question already has answers here : Java - How to find a value from a hashmap that is the closest to a particular number? (4 answers) Closed 4 years ago . As the title suggests. I need the functionality of where the grade "A" is returned for any score between 90-100. Or in this case, whatever cutoff the user decides to set based on a curve or something. This is what I had but I can't think of a way to have it do what I want it to. private HashMap<String, Double> letterGrade = new HashMap

HashMap的ReHash图解

大城市里の小女人 提交于 2020-04-06 18:26:00
昨天在看redis的hash扩容时提到了与java的hashmap类似,之前一直没有仔细研究过,翻了几篇博客,选了容易理解的一片转载下。 resize方法 void resize ( intnewCapacity ) { Entry [ ] oldTable = table ; intoldCapacity = oldTable . length ; . . . . . . //创建一个新的Hash Table Entry [ ] newTable = new Entry [ newCapacity ] ; //将Old Hash Table上的数据迁移到New Hash Table上 transfer ( newTable ) ; table = newTable ; threshold = ( int ) ( newCapacity * loadFactor ) ; } transfer方法 void transfer ( Entry [ ] newTable ) { Entry [ ] src = table ; intnewCapacity = newTable . length ; //下面这段代码的意思是: // 从OldTable里摘一个元素出来,然后放到NewTable中 for ( int j = 0 ; j < src . length ; j ++ ) {