Java基础
siyuan_999
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap是怎么保证线程安全的(1.8)
在1.8中ConcurrentHashMap采用分段锁和CAS+synchronized的方式保证线程安全,分段锁采用内部类Segment实现,实现了ReentrantLock方法;原创 2023-06-05 22:03:10 · 671 阅读 · 1 评论 -
HashMap的hash方法如何实现的
所以,通过扰动函数,原本连续的 hash 值 1 到 7,变成了 0, 2, 3, 5, 6这样更加分散的序列。7 -> 7 ^ (7 >>> 16) = 7 ^ 0 = 7 可以看到,通过异或运算,1 的 hash 值变成了 0,和其他 hash 值的差距变大了。让 hash 值的分布更加均匀。如果直接使用 key.hashCode(),很可能高位和低位的值都很相近,导致 hash 值分布不均,最终存储位置的分布也不均匀,容易发生冲突。假设我们有这样的输入:1, 2, 3, 4, 5, 6, 7。原创 2023-06-05 20:24:34 · 45 阅读 · 1 评论 -
HashMap的get和set方法
【代码】HashMap的get和set方法。原创 2023-06-04 18:20:54 · 203 阅读 · 0 评论 -
解决hash冲突的方法有哪些?
所有发生冲突的元素存入一个公共的溢出区,通过链表的方式解决冲突。综上,开放定址法和链地址法是两种常用的hash冲突解决方法。- 双重散列(Double hashing):使用两个不同的散列函数,当第一个位置冲突时使用第二个散列函数探测下一个位置。- 二次探测(Quadratic probing):以步长为1、3、5、7...的平方数线性探测下一个位置。这种方法在发生冲突时,通过扫描表中的其他位置来查找一个空闲的存储位置。当冲突达到一定程度时,对已经存入的所有元素重新进行散列,获得一个更大的哈希表。原创 2023-06-04 15:48:33 · 358 阅读 · 0 评论 -
HashMap、HashTable、ConcurrentHashMap区别是什么
在1.8之前采用分段锁,将hash表分为16个分片,对每个分片进行加锁,锁的粒度更细;1.8以后采用CAS+synchronized实现加锁,对每个桶进行加锁,锁的粒度更细。继承了AbstractMap,实现了ConcurrentMap接口。继承了AbstractMap,实现了 Map。中方法是同步的,所以是线性安全的。继承了Dictionary类。原创 2023-06-04 16:18:02 · 42 阅读 · 1 评论 -
ArrayList序列化是怎么实现的?
在readObject()方法中,首先读取序列化的size字段;实现了Serializable接口,表明其实例可以被序列化,仅序列化size字段,其elementData数组被定义为transient,不会被序列化,因为elementData数组内容过大,直接序列化效率低下,且ArrayList大小可变,序列化时数组大小不代表最终大小,所以只serialize size,在反序列化时根据size重新构建elementData数组。原创 2023-06-02 23:03:34 · 436 阅读 · 2 评论