
面试题总结
文章平均质量分 62
丁小喜
荷花上面有蛤蟆,一戳一蹦跶
展开
-
面试题:ConcurrentHashMap的put方法执行过程,执行逻辑是什么?ConcurrentHashMap中的Node节点是什么?(jdk1.8)
如果节点已经存在,并且它的哈希值、键值与要插入的键值相匹配,那么直接返回旧值。扩容过程中,旧的哈希表将被复制到一个新的更大的哈希表中,同时新的键值对也会被插入到新的哈希表中。:首先,使用键(key)的哈希值计算出在哈希表中的索引位置,然后尝试定位到对应的 Node 节点。关键字修饰,以确保在多线程环境下对该字段的修改能够立即对其他线程可见,从而保证内存的可见性。的基本存储单元,它通过继承和字段设计,实现了线程安全的键值对存储和哈希表的高效操作。方法返回与新插入键关联的旧值,如果之前没有这个键的值,则返回。原创 2024-07-21 21:25:56 · 830 阅读 · 0 评论 -
面试题:为什么说HashMap是线程不安全的?有什么解决方法?
如果线程 A 首先执行,它将键 1 与 “ValueA” 关联。然后,线程 B 执行并尝试将相同的键 1 与 “ValueB” 关联。当 HashMap 需要扩容时,它会创建一个新的内部数组并重新分配现有的键值对。线程尝试读取该值,它可能会得到 “Updated” 或 “Initial”,这取决于线程的执行顺序和 JVM 的内存模型。如果多个线程尝试填充这个 HashMap 并触发扩容,可能会导致键值对的丢失或不正确的映射。当迭代 HashMap 时,如果其他线程修改了 HashMap,迭代器可能会抛出。原创 2024-07-20 21:13:32 · 907 阅读 · 0 评论 -
面试题:Java中堆内存和栈内存的区别,缓存数据是把数据放到哪里
在Java中,堆内存(Heap)和栈内存(Stack)是两种不同类型的内存区域。它们各自扮演着不同的角色,并具有不同的特性。原创 2024-07-20 20:53:01 · 1191 阅读 · 0 评论 -
面试题 HashMap中key的存储索引是怎么计算的
为了减少哈希冲突并使哈希值分布更均匀,JDK 1.8对哈希值进行了一些额外处理,即通过一个位运算将高位的哈希值混合到低位。哈希值计算出来之后,接下来需要将哈希值映射到数组的索引位置。通过上述步骤和代码,我们可以看到HashMap在JDK 1.8中是如何计算键的索引值的。的结果相当于取哈希值的低几位,这样可以确保索引值在0到n-1之间。假设数组的长度是2的幂(HashMap的容量总是2的幂),则。操作是按位与运算,它能确保计算出来的索引值在数组的范围内。的二进制表示将是全1,比如容量为16时,原创 2024-07-17 20:37:37 · 348 阅读 · 1 评论 -
HashMap默认加载因子是多少?为什么要设置成这个值?
加载因子的值越高,哈希表的填充程度越大,意味着哈希表的性能可能会降低,因为更多的哈希冲突可能导致查找、插入和删除操作的效率降低。这意味着,当哈希表的实际存储的键值对数量达到其容量的75%时,会触发扩容操作。扩容操作会创建一个新的哈希表,其容量通常是原始容量的两倍,并将原始哈希表中的所有键值对重新散列到新的哈希表中。例如,如果加载因子设置为0.75,而哈希表的容量为100,则当哈希表中的元素数量达到75时,就会进行Rehash。加载因子越小,哈希表的容量越大,元素的分布就越稀疏,哈希冲突的可能性就越小。原创 2024-07-17 20:24:12 · 598 阅读 · 0 评论