Map集合的特点和概述
Map集合概述
interface Map<K,V> K:键的类型;V:值的类型
Map集合的特点
键值对映射关系;
一个键对应一个值;
键不能重复,值可以重复;
元素存取无序;
HashMap 的实现原理?
HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作, 并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap的数据结构: 在Java编程语言中, 基本的结构就是两种,一个是数组,另外一个是模拟指针 (引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上 是一个“链表散列”的数据结构,即数组和链表的结合体。
HashMap 基于 Hash 算法实现的 1. 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中 的下标 2. 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相 同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value 放入链表中 3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。 4. 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方 式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。 需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个 之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
HashMap
HashMap实现了Map接口,用于存储K,V键值对的集合类。
主要特征包括:Key可存NULL、无序、线程不安全。
存储结构: 底层使用了数组+链表+红黑树的结构。
查询:使用哈希算法查询
HashMap put 插入过程。
简单划分为以下4个过程:
1.初始化检查
如果数组为空,则初始化数据。
2.确定插入位置
散列计算确定插入的哈希桶位置,采用Hash值对N取模【 hash & (N-1)】,确定哈希桶的位置。
3.哈希碰撞、处理阶段
如果要插入的哈希桶为空,则直接插入节点。
如果哈希桶有值了,则判断是哈希冲突还是重复插入。
如果是重复插入,则更新插入的值。
如果是哈希冲突,则采取处理哈希冲突的策略,策略包括拉链法和构建红黑树。
4.容量检查、扩容
插入节点后,如果超出了阈值【数组大小*负载因子】,进行Resize扩容操作。
HashMap插入数组的位置如何确定。
采用Hash值对容量N取模,模得到的值即是下标值。
在HashMap中采用位运算进行取模:(n-1) & hashCode()。
HashMap如何判断哈希冲突
当两个Key的HashCode相同,且Key不同时,认定为冲突。
HashMap中如何处理哈希碰撞。
当发生哈希碰撞时,首先会采用拉链法处理冲突。
当哈希桶中拉链长度小于等于8时,会采用尾插法插入节点,形成一个单向链表。
当拉链长度大于8,且数组容量【哈希桶】小于64时,会进行扩容,不会进行树化。
当拉链大于8且数组容量大于等于64时,会将链表转换为红黑树。
HashMap在JDK1.7和JDK1.8中有哪些不同? HashMap的底层实现
在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除 困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各 自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。