HashMap原理,Hash冲突,同步集合,并发集合,线程安全集合及实现原理

HashMap原理

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap储存的是键值对,HashMap很快。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
通过hash的方法,put、get存储和获取对象。

HashMap加载因子

若加载因子越大,填满的元素越多,好处是,空间利用率高了,但冲突的机会加大了.链表长度会越来越长,查找效率降低。
反之,加载因子越小,填满的元素越少,好处是冲突的机会减小了,但空间浪费多了.表中的数据将过于稀疏(很多空间还没用,就开始扩容了)
冲突的机会越大,则查找的成本越高. 因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷.
这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷.
如果机器内存足够,并且想要提高查询速度的话可以将加载因子设置小一点;相反如果机器内存紧张,并且对查询速度没有什么要求的话可以将加载因子设置大一点。不过一般我们都不用去设置它,让它取默认值0.75就好了。

在构造HashMap的时候可以指定加载因子和初始容量,默认初始容量为16,默认加载因子为0.75,每次扩容为当前的2倍。
提前预知HashMap的大小能够提升性能,因为自动扩容的时候会暂用资源。

Hash冲突

通过哈希函数把键映射成索引,在多个键映射的索

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap实现原理是基于哈希表(Hash Table)的数据结构。在HashMap中,每个元素被存储为键值对(key-value pair),通过计算键的哈希值来确定其在数组中的存储位置。 具体实现原理如下: 1. 当我们向HashMap中插入一个键值对时,首先会计算键的哈希值。 2. 根据哈希值,HashMap使用哈希函数将其转换为一个数组索引。 3. 如果该索引处没有元素,则直接将键值对插入该位置。 4. 如果该索引处已经存在元素,则发生冲突HashMap会使用链表或者红黑树的方式来处理冲突(JDK 8之后,如果链表长度超过阈值(默认为8),链表会转换为红黑树)。 5. 当需要查找元素时,HashMap会根据键的哈希值找到对应的数组索引,并在该位置上进行查找。 HashMap如何保证线程安全取决于具体的使用场景和需求。如果在多线程环境下使用HashMap,并且涉及到插入、删除、修改等操作,可以考虑以下几种方式来保证线程安全: 1. 使用ConcurrentHashMap:ConcurrentHashMap是Java提供的线程安全的哈希表实现。它使用了分段锁(Segment)的机制来保证并发访问的安全性,可以支持高并发的读操作和部分并发的写操作。 2. 使用Collections.synchronizedMap()方法:通过该方法可以将HashMap转换为线程安全的Map,底层使用了同步块(synchronized block)来保证线程安全。例如:Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>()); 3. 使用锁机制:在多线程环境下,可以使用显式的锁机制(如ReentrantLock、synchronized等)来对HashMap进行加锁,保证每次操作的原子性和互斥性。 需要注意的是,即使采取了上述措施来保证HashMap线程安全性,也需要根据具体业务场景考虑并发读写带来的性能影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值