treeify

【重点,要考的】数据结构及算法基础--哈希图(HashMap)

吃可爱长大的小学妹 提交于 2020-04-07 07:20:33
HashMap可以说是java中最常见的几种集合了。 在了解HashMap前我们要先了解Object的两个方法:Equals和hashCode() 首先我们来看一下object内的源码是怎样实现的: hashcode(): /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided by * {@link java.util.HashMap}. * <p> * The general contract of {@code hashCode} is: * <ul> * <li>Whenever it is invoked on the same object more than once during * an execution of a Java application, the {@code hashCode} method * must consistently return the same integer, provided no information * used in {@code equals} comparisons on the object is modified

浅谈JDK1.8的HashMap

≯℡__Kan透↙ 提交于 2020-04-06 07:16:17
浅谈JDK1.8的HashMap 跟同事聊天的时候,聊到HashMap,在java8下是有数组+链表+红黑树组成,在map的size达到一定长度之后,会由链表转换成红黑树。这引发了我的强烈好奇心,为什么1.8会进行链表跟红黑树之间的转换,在什么情况下会进行转换? 于是我就开始上网查资料,看源码,知道了HashMap里面的成员变量的意思 //数组默认初始容量:16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //数组最大容量2 ^ 30 次方 static final int MAXIMUM_CAPACITY = 1 << 30; //默认负载因子的大小:0.75 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 树形最小容量:哈希表的最小树形化容量,超过此值允许表中桶转化成红黑树 static final int MIN_TREEIFY_CAPACITY = 64; // 树形阈值:当链表长度达到8时,将链表转化为红黑树 static final int TREEIFY_THRESHOLD = 8; //树形阈值:当长度小于6时,将红黑树转化为链表 static final int UNTREEIFY_THRESHOLD = 6; //hashmap修改次数

面试刷题10:ConcurrentHashMap如何保证线程安全?

让人想犯罪 __ 提交于 2020-03-25 17:43:25
3 月,跳不动了?>>> <br /> <br /> <br />集合框架中的HashTable,Stack,以及同步包装集合在高并发场景下都非常低效,java提供了并发包应对高并发场景。<br /> <br /> <br />我是李福春,我在准备面试,今天的问题是?<br /> <br />java提供了哪些并发的容器?ConcurrentHashMap如何保证线程安全?<br /> <br /> java体系中的并发容器 <br /> <br />java体系中有如下同步容器:<br /> <br />1, HashTable,Stack 同步容器,内部使用sychronized关键字保证同步操作;<br /> <br />2,同步包装器Collections.synchronizedMap(),内部也使用sychronized关键字保证同步操作; 3,并发包提供的同步容器,比如ConcurrentHashMap , CopyOnWriteArrayList , ArrayBlockingQueue,SynchronizedQueue ConcurrentHashMap的同步分析 <br /> <br />为何会出现ConcurrenHashMap?<br /> <br />1, HashTable在高并发场景下性能低下;<br /> <br />2,HashMap

HashMap(JDK1.8)源码剖析

十年热恋 提交于 2020-03-18 19:05:04
3 月,跳不动了?>>> HashMap(JDK1.8)源码剖析 ​ 这又是看了忘忘了看系列之一,今天有空写个文档记录下,希望能从JDK源码中慢慢悟出他们优秀的思想。本文主要记录以下几个方面。 ​ 1、HashMap的继承、实现结构 ​ 2、HashMap的构造函数们及属性们 ​ 3、HashMap的核心方法们 1、HashMap的继承、实现结构 ​ 以上就是HashMap的继承结构图,相对来说是比较简单的结构。下面是HashMap的概念图。 2、HashMap的构造函数们及属性们 2.1 属性 ​ 我们先看下HashMap的属性变量 // 如果创建HashMap时候不指定容量,那么默认容量就是16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 最大容量为2的30次方 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认容量因子,符合泊松分布 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 树化一个槽位的阈值,一个槽位节点个数大于这个值且满足容量大于最小容量就树化 static final int TREEIFY_THRESHOLD = 8; // 树化还原阈值 static final int

【源码分析】HashMap源码再读

限于喜欢 提交于 2020-03-17 01:34:11
某厂面试归来,发现自己落伍了!>>> 最近工作不是太忙,准备再读读一些源码,想来想去,还是先从JDK的源码读起吧,毕竟很久不去读了,很多东西都生疏了。当然,还是先从炙手可热的 HashMap ,每次读都会有一些收获。当然,JDK8对HashMap有一次优化 一、一些参数 我们首先看到的,应该是它的一些基本参数,这对于我们了解HashMap有一定的作用。他们分别是: 参数 说明 capacity 容量,默认为16,最大为2^30 loadFactor 加载因子,默认0.75 threshold resize的阈值,capacity * loadFactor,元素数量达到这个值后就必须扩容 treeify_threshold 红黑树的阈值,数组中的某个节点下挂的节点数大于这个值之后,节点的数据结构就会从链表变为红黑树 二、重要方法 我们知道,HashMap底层是通过数组+链表来实现的。具体的图网上有很多,我们主要看看几个重要的方法。 2.1 构造方法 他的构造方法,最本质的构造方法是: public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " +

hashMap怎么解决hash冲突的

℡╲_俬逩灬. 提交于 2020-03-01 23:09:28
学Java的都知道hashMap的底层是“链表散列”的数据结构也也可以说是hash表。在put的实话先根据key的hashcode重新计算hash值的,而我们又知道hash是一种算法。所以哈希码并不是完全唯一的。 查看哈希码百科: http://kaigejava.com/article/detail/168 哈希表可以说就是数组链表,底层还是数组但是这个数组每一项就是一个链表 一:为什么说hashmap的put方法是根据key进行hashcode计算的呢? 查看源码: 在查看hash方法,如下: 查看putVal方法: final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node [] tab; Node p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node e; K k; if (p.hash == hash && ((k = p.key) ==

搞懂 Java HashMap 源码

可紊 提交于 2020-03-01 21:21:01
HashMap 源码分析 前几篇分析了 ArrayList , LinkedList , Vector , Stack List 集合的源码,Java 容器除了包含 List 集合外还包含着 Set 和 Map 两个重要的集合类型。而 HashMap 则是最具有代表性的,也是我们最常使用到的 Map 集合。我们这篇文章就来试着分析下 HashMap 的源码,由于 HashMap 底层涉及到太多方面,一篇文章总是不能面面俱到,所以我们可以带着面试官常问的几个问题去看源码: 了解底层如何存储数据的 HashMap 的几个主要方法 HashMap 是如何确定元素存储位置的以及如何处理哈希冲突的 HashMap 扩容机制是怎样的 JDK 1.8 在扩容和解决哈希冲突上对 HashMap 源码做了哪些改动?有什么好处? 本文也将从以上几个方面来展开叙述: 由于掘金后台审核可能会由于某些原因造成文章发布延迟或者遗漏,如果感觉我写的源码分析文章还不错,可以关注我,以后我每次更新文章就可以收到推送了。另外博主也是在努力进步中,所有文章如果有问题请尽管留言给我。我会及时改正。大家一起进步。 概述 为了方便下边的叙述这里需要先对几个常见的关于 HashMap 的知识点进行下概述: HashMap 存储数据是根据键值对存储数据的,并且存储多个数据时,数据的键不能相同,如果相同该键之前对应的值将被覆盖

集合操作-HashMap源码分析

心不动则不痛 提交于 2020-02-29 21:56:37
HashMap有4个构造函数 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); } public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR;

重新认识java-HashMap

安稳与你 提交于 2020-02-29 21:01:58
重新认识java-HashMap 源码解读 类声明 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 功能和特点 实现 AbstractMap 抽象类。Map的一些操作这里面已经提供了默认实现,后面具体的子类如果没有特殊行为,可直接使用 AbstractMap 提供的实现。 实现 Map , Clone , Serializable 接口。支持拷贝和序列化。支持Map常见的增删查改。 HashMap 是数组和链表的折中,既保证了几乎$O(1)$的时间复杂度,也保证了插入和删除的时间复杂度为$O(1)$。 基本概念 在 HashMap 内部,采用了数组+链表的形式来组织键值对 Entry <Key,Value> 。 HashMap 内部维护了一个 Entry[] table 数组,当我们使用 new HashMap()创建一个HashMap时, Entry[] table 的默认长度为16。 Entry[] table 的长度又被称为这个 HashMap 的容量( capacity ); 对于 Entry[] table 的每一个元素而言,或为 null ,或为由若干个 Entry<Key,Value> 组成的链表。HashMap中 Entry

一文搞定HashMap的实现原理和面试

血红的双手。 提交于 2020-02-29 06:30:03
前言 HashMap在日常开发中基本是天天见的,而且都知道什么时候需要用HashMap,根据Key存取Value,但是存和取的时候那些操作却是很少去研究。同时在面试中也是面试官们必问的。 以下是基于JDK1.8 正文 先看看HashMap的结构图: 1. 先来认识一下HashMap中定义的一些需要了解的成员变量 // hashMap数组的初始容量 16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 负载因子 0.75f; static final float DEFAULT_LOAD_FACTOR = 0.75f; // 树形化阈值 8 static final int TREEIFY_THRESHOLD = 8; // 解除树形化阈值 6 static final int UNTREEIFY_THRESHOLD = 6; // 树形化的另一条件 Map数组的长度阈值 64 static final int MIN_TREEIFY_CAPACITY = 64 // 这个就是hashMap的内部数组了,而Node则是链表节点对象。 transient Node<K,V>[] table; // 数组扩容阈值。 int threshold; initialCapacity 数组的初始容量为16。可以在构造方法中指定