HashMap实现原理

HashMap基于Map接口的非同步实现,允许null键和null值
此类不保证映射顺序,不保证该顺序永远不变
HashMap的数据结构:
链表和数组的结合体
底层实现是一个数组,数组的每一项就是一个链表,Entry是一个static class,其中包含key、value以及next,它的key和hash是final的
HashMap在容量总是2的n次方,h&(length-1)相当于对length取模,但是&比%更有效率,hash的计算
h=key.hashcode
h=h^(h>>16)
低位加入高位信息
HashMap的get方法,没,首根据hash的key计算hashcode,再根据key的equals方法在对应的链表中找需要的元素
hashmap中元素越来越多的时候,hash冲突几率就会越来越高,为了提高查询效率,就要对hashmap进行扩容,当hashmap中的元素个数超过数组大小*loadfactor时,就会进行数组扩容,loadFactor的默认值为0.75,数组扩容大小为扩容2倍,负载因子越大,对空间利用更充分,但是查找效率降低,如果负载因子过小,散列表过于稀疏,对空间造成严重浪费
hashmap不是线程安全的,如果在使用迭代器的过程中,有其他线程修改了map,将抛出ConcurrentModificationException,就是所谓fail-fast策略
HashSet实现原理:
它基于HashMap实现的,底层采用HashMap来保存元素,所以相关hashset的操作都是使用hashMap底层方法,应该将保存在hashset中的对象覆盖hashCode和equals。因为hashset中包含的对象都是hashmap中的key,value都是PRESENT
HashTable 是一个散列表,内容存储的内容键值对,hashtable继承于Dictionary类,实现了Map,hashtable是通过拉链法实现哈希表的
LinkedHashMap:
HashMap是无序的
LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出和输入时的顺序相同,可以按照插入顺序或者访问顺序进行迭代
LinkedHashSet是通过LinkedHashMap来实现的,继承自HashSet,
ArrayList可以理解为动态数组,实现了List接口,
LinkedList 基于链表实现所以类中包含两个指针,first和last,构成双向链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值