关于Map的遍历乱序

在往hashmap中插入key时,我们会发现一个问题。其中的key并非按照我们插入时的顺序插入的。

这个让人很苦恼。

在网上看到了这么一段话:

public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。)

LinkedHashMap这个虽然增加了开销,但有时候还是挺有用的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中,当我们对map进行遍历,并不是固定地从第一个键值对开始遍历,每次都是从随机的一个位置开始遍历。即使是一个不会改变map,仅仅只是遍历它,也不太可能会返回一个固定顺序了。这是因为Go的map使用了散列表(hash table)作为底层数据结构,散列表的特性决定了遍历顺序是不确定的。 另外,Go的Map的扩容有两种方法:成倍扩容和等量扩容。这两种方法都会对内存进行扩容,迫使元素顺序变化,从而导致Go的Map遍历结果无序。这是因为扩容会重新计算散列值,并重新分配存储空间,导致键值对在内存中的位置发生变化,进而导致遍历结果的无序性。 类似地,在读取CSV文件并通过Lua表遍历,每次重新运行Lua程序后,遍历Lua表的键值顺序也有不同。这是因为Lua表的内部是由数组和哈希表实现的。读取CSV文件的键值顺序是固定的,但是插入Lua表以及遍历Lua表键值的顺序可能会受到哈希表的影响,导致遍历结果的无序性。 因此,map遍历乱序原因是由于底层数据结构的特性,以及可能的内存扩容和哈希表的影响。这是为了提高map和Lua表的性能和效率,而在实际使用,我们应该不依赖于遍历顺序,而是考虑使用其他方式来处理键值对的顺序要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [go语言面试(第一轮)请你说说map遍历为什么是无序的](https://blog.csdn.net/MLittlehands/article/details/126893295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Lua表遍历乱序问题](https://blog.csdn.net/mfkxowvfp/article/details/115366328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值