赞
踩
常见的数据结构有数组结构、链表结构、哈希表结构。
HashMap简介:HashMap是基于哈希表实现的,每个元素都是一个key-value对,其内部通过单链表解决冲突,内存不足(超越了阈值)时,可以自动增长。
HashMap特点:
HashMap中put()和get()的实现原理:
扩容机制:
提到扩容机制需要先明白几个变量:
size:记录HashMap的底层数组中已用的槽的数量;
threshold:HashMap的阈值,用于判断是否需要调整HashMap的容量,计算方式为threshold = 容量 * 加载因子
加载因子:表示哈希表在其容量自动增加之前可以达到多满的一种尺度,如果加载很大,对空间的利用更充分,但是查找效率会降低;如果加载因子太小。那么表中的很多空间还没有使用就开始扩容了,对空间造成浪费。默认值为0.75。
容量:表示哈希表中槽的数量,即哈希表的长度,初始容量是创建哈希表的容量,如果不指明初始容量,则默认为16。
特别注意:无论我们指定容量为多少,构造方法都会将实际容量设为不小于指定容量的2的次方的一个数,且最大值不能超过2的30次方。
扩容时间:当size大于threshold的时候进行扩容。
扩容过程:
扩容是新建了一个HsahMap的底层数组,然后调用transfer方法,将HashMap的全部元素添加到新的HashMap中,同时重新计算元素在新的数组中的索引位置。很明显,扩容是非常耗时的操作。
HashMap共有四个构造方法,构造方法中提到了两个很重要的参数:初始容量和加载因子,这两个参数是影响HashMap性能的重要参数。
HashMap红黑树:
什么是HashMap红黑树?
将HashMap表中的单一链表长度过长时,此时修改或者查找HashMap中的数据就会非常耗时,时间效率为O(n),即将所有数据遍历一边,效率降低;为了能够恢复HashMap快速查找和修改数据的优点,将单一链表用红黑树进行替换,此时的时间效率会缩减到O(logn),效率不会因为链表长度过长而导致效率降低。
什么时候采用HashMap红黑树,什么时候采用HashMap?
当HashMap表中的单一链表长度大于8时,链表结构就会转化为红黑树结构;当单一链表长度小于6的时候,又会由红黑树结构转化为链表结构。
HashTable的数据结构跟HashMap相同,此处主要讲解HashTable与HashMap之间的区别。
底层原理:HashSet底层完全就是在HashMap的基础上包了一层,只不过存储的时候value默认存储了一个object类型的静态常量,取的时候也是只返回key,看起来像是List一样。HashSet的四个构造方法都是初始化一个HashMap,初始容量、装填因子Add()、Remove()、contains()方法都是直接调用HashMap的实现。
需要重写HashCode() 和 Equals() ,需要这两个方法确保存储的值没有相等。Equals默认比较的是两个对象的内存地址。
HashMap与HashSet的区别:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。