map
varyall
这个作者很懒,什么都没留下…
展开
-
阿里面试题:为什么Map桶中个数超过8才转为红黑树
这是一个好友面试阿里时,被问到的一个问题,应该不少人看到这个问题都会一面懵逼。因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什么当链表长度为8的时候才做转换动作。第一反应也是一样,只能初略的猜测是因为时间和空间的权衡。要弄明白这个问题,首先要明白为什么要转换,这个问题比较简单,因为Map中桶的元素初始化是链表保存的,其查找性能是O(n),而树结构能将查找性能提升到O(lo...转载 2019-12-19 22:19:26 · 254 阅读 · 0 评论 -
TreeMap 排序
一、TreeMapTreeMap 默认排序规则:按照key的字典顺序来排序(升序)当然,也可以自定义排序规则:要实现Comparator接口。用法简单,先看下下面的demopublic class SortDemo { public static void main(String[] args) { System.out.println("-----...转载 2018-09-11 22:47:05 · 5873 阅读 · 0 评论 -
java基础LinkedHashMap原理
详情见博客这里先记录一下基本原理。在LinkedHashMapMap中,所有put进来的Entry都保存在如下面第一个图所示的哈希表中,但由于它又额外定义了一个以head为头结点的双向链表(如下面第二个图所示),因此对于每次put进来Entry,除了将其保存到哈希表中对应的位置上之外,还会将其插入到双向链表的尾部。 更直观地,下图很好地还原了Link...转载 2018-09-02 21:17:49 · 1070 阅读 · 0 评论 -
LinkedHashMap原理和底层实现
1.概述在使用HashMap的时候,可能会遇到需要按照当时put的顺序来进行哈希表的遍历。通过上篇对HashMap的了解,我们知道HashMap中不存在保存顺序的机制。本篇文章要介绍的LinkedHashMap专为此特性而生。在LinkedHashMap中可以保持两种顺序,分别是插入顺序和访问顺序,这个是可以在LinkedHashMap的初始化方法中进行指定的。相对于访问顺序,按照插入顺序进行...转载 2018-09-02 21:16:36 · 12050 阅读 · 4 评论 -
图解LinkedHashMap原理
1 前言LinkedHashMap继承于HashMap,如果对HashMap原理还不清楚的同学,请先看上一篇:图解HashMap原理2 LinkedHashMap使用与实现先来一张LinkedHashMap的结构图,不要虚,看完文章再来看这个图,就秒懂了,先混个面熟: LinkedHashMap结构.png2.1 应用场景HashMap是无序的,当我们希望有顺序地去...转载 2018-09-02 21:15:27 · 560 阅读 · 0 评论 -
Java集合-LinkedHashMap工作原理
原创作品,转载请注明出处。概述在了解了Java集合-HashMap源码实现深入解析后,再来看LinkedHashMap就简单的多了。先来个示例程序:LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();map.put("语文", "1");map.put("数学",...转载 2018-09-02 21:08:53 · 157 阅读 · 0 评论 -
ConcurrentHashMap源码分析(JDK8) 扩容实现机制
jdk8中,采用多线程扩容。整个扩容过程,通过CAS设置sizeCtl,transferIndex等变量协调多个线程进行并发扩容。扩容相关的属性nextTable扩容期间,将table数组中的元素 迁移到 nextTable。 /** * The next table to use; non-null only while resizing. 扩容...转载 2018-07-30 12:56:01 · 13882 阅读 · 4 评论 -
ConcurrentHashMap JDK1.7与JDK1.8源码区别
前言以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。...转载 2018-07-29 23:22:01 · 268 阅读 · 0 评论 -
hashmap hashtable ConcurrentHashMap 扩容
hashmap扩容:默认大小: 16, 增长因子:0.75扩容点规则(什么时候扩容): 16*0.75=12存储方式:数组+链表扩容方法:扩容为原来的2倍出现于:JDK1.2扩容条件:1、判断当前个数是否大于等于阈值2、当前存放是否发生哈希碰撞 hashtable扩容:默认大小: 11, 增长因子:0.75扩容点规则(什么时候扩容): 11*0.75...原创 2018-07-29 23:18:06 · 2267 阅读 · 3 评论 -
hashMap底层put和get方法逻辑
1.hashmap put方法的实现:12345678910111213141516171819public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, ta...转载 2018-05-14 17:47:51 · 765 阅读 · 0 评论 -
为啥要用位运算代替取模呢
在hash中查找key的时候,经常会发现用&取代%,先看两段代码吧, JDK6中的HashMap中的indexFor方法:Java代码 /** * Returns index for hash code h. */ static int indexFor(int h, int length) { return h &转载 2017-12-21 13:42:40 · 6486 阅读 · 0 评论 -
疫苗:JAVA HASHMAP的死循环
在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(在网上查“HashMap Infinite Loo转载 2017-10-12 00:10:38 · 279 阅读 · 0 评论 -
HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别。当时有些紧张只是简单说了下HashMap不是线程安全的;Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁;转载 2017-10-12 00:08:57 · 570 阅读 · 0 评论 -
容器--(*)深入理解HashMap(及hash函数的真正巧妙之处)
原文地址:http://www.iteye.com/topic/539465 /** *@author annegu *@date 2009-12-02 */ Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到相关的内容,就正好复习一下。网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论转载 2016-12-18 22:59:19 · 562 阅读 · 0 评论 -
Java集合---HashMap源码剖析
一、HashMap概述二、HashMap的数据结构三、HashMap源码分析 1、关键属性 2、构造方法 3、存储数据 4、调整大小 5、数据读取 6、HashMap的性能参数 7、Fail-Fast机制 一、Has转载 2016-12-18 22:43:34 · 240 阅读 · 0 评论