网站建设编辑工作总结,近期十大热点新闻,湖北百度推广公司,北海 网站建设 公司HashMap概述 HashMap是基于哈希表的Map接口实现的#xff0c;它存储的是内容是键值对key,value映射。此类不保证映 射的顺序#xff0c;假定哈希函数将元素适当的分布在各桶之间#xff0c;可为基本操作(get和put)提供稳定的性能。
HashMap在JDK1.8以前数据结构和存…HashMap概述 HashMap是基于哈希表的Map接口实现的它存储的是内容是键值对key,value映射。此类不保证映 射的顺序假定哈希函数将元素适当的分布在各桶之间可为基本操作(get和put)提供稳定的性能。
HashMap在JDK1.8以前数据结构和存储原理 【链表散列】 首先我们要知道什么是链表散列通过数组和链表结合在一起使用就叫做链表散列。这其实就是 hashmap存储的原理图。 【HashMap的数据结构和存储原理】 HashMap的数据结构就是用的链表散列。那HashMap底层是怎么样使用这个数据结构进行数据存取的呢分成两个部分 第一步HashMap内部有一个entry的内部类其中有四个属性我们要存储一个值则需要一个key 和一个value存到map中就会先将key和value保存在这个Entry类创建的对象中。
static class EntryK,V implements Map.EntryK,V {
final K key; //就是我们说的map的key
V value; //value值这两个都不陌生
EntryK,V next;//指向下一个entry对象int hash;//通过key算过来的你hashcode值。
}Entry的物理模型图 第二步构造好了entry对象然后将该对象放入数组中如何存放就是这hashMap的精华所在了。 大概的一个存放过程是通过entry对象中的hash值来确定将该对象存放在数组中的哪个位置上如果在这个位置上还有其他元素则通过链表来存储这个元素。 【Hash存放元素的过程】 通过key、value封装成一个entry对象然后通过key的值来计算该entry的hash值通过entry的hash 值和数组的长度length来计算出entry放在数组中的哪个位置上面 每次存放都是将entry放在第一个位置。在这个过程中就是通过hash值来确定将该对象存放在数组中的哪个位置上。
JDK1.8后HashMap的数据结构
上图很形象的展示了HashMap的数据结构数组链表红黑树桶中的结构可能是链表也可能是红黑树红黑树的引入是为了提高效率。
HashMap的属性 HashMap的实例有两个参数影响其性能。
初始容量哈希表中桶的数量
加载因子哈希表在其容量自动增加之前可以达到多满的一种尺度,当哈希表中条目数超出了当前容量加载因子(其实就是HashMap的实际容量)时则对该哈希表进行rehash操作将哈希表扩充至两倍的桶数。 Java中默认初始容量为16加载因子为0.75。 static final int DEFAULT_INITIAL_CAPACITY 14; // aka 16 static final float DEFAULT_LOAD_FACTOR 0.75f; 【loadFactor加载因子】 定义loadFactor译为装载因子。装载因子用来衡量HashMap满的程度。loadFactor的默认值为 0.75f。计算HashMap的实时装载因子的方法为size/capacity而不是占用桶的数量去除以capacity。 loadFactor加载因子是控制数组存放数据的疏密程度loadFactor越趋近于1那么数组中存放的数据(entry)也就越多也就越密也就是会让链表的长度增加loadFactor越小也就是趋近于0那么数组 中存放的数据也就越稀也就是可能数组中每个位置上就放一个元素。那有人说就把loadFactor变为1 最好吗存的数据很多但是这样会有一个问题就是我们在通过key拿到我们的value时是先通过key 的hashcode值找到对应数组中的位置如果该位置中有很多元素则需要通过equals来依次比较链表
中的元素拿到我们的value值这样花费的性能就很高如果能让数组上的每个位置尽量只有一个元素最好我们就能直接得到value值了所以有人又会说那把loadFactor变得很小不就好了但是如果变 得太小在数组中的位置就会太稀也就是分散的太开浪费很多空间这样也不好所以在hashMap 中loadFactor的初始值就是0.75一般情况下不需要更改它。 static final float DEFAULT_LOAD_FACTOR 0.75f; 【桶】 根据前面画的HashMap存储的数据结构图你这样想数组中每一个位置上都放有一个桶每个桶里就是装一个链表链表中可以有很多个元素(entry)这就是桶的意思。也就相当于把元素都放在桶中。 【capacity】 capacity译为容量代表的数组的容量也就是数组的长度同时也是HashMap中桶的个数。默认值是 16。 一般第一次扩容时会扩容到64之后好像是2倍。总之容量都是2的幂。 static final int DEFAULT_INITIAL_CAPACITY 14; // aka 16 【size的含义】 size就是在该HashMap的实例中实际存储的元素的个数 【threshold的作用】 int threshold; threshold capacity * loadFactor当Sizethreshold的时候那么就要考虑对数组的扩增了也就是说这个的意思就是衡量数组是否需要扩增的一个标准。 注意这里说的是考虑因为实际上要扩增数组除了这个sizethreshold条件外还需要另外一个条 件。 什么时候会扩增数组的大小在put一个元素时先sizethreshold并且还要在对应数组位置上有元素 这才能扩增数组。 我们通过一张HashMap的数据结构图来分析