HashMap有序性与无序性阐述

1.插入无序

public class HashMapTest {

    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("Liyuanfang", "射手");
        map.put("Yuange", "刺客");
        map.put("Zhugeliang", "法师");
        map.put("Xiahoudun", "坦克");
        map.put("Guiguzi", "辅助");

        System.out.println("第一次输出:");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey());
        }
        System.out.println("\n第二次输出:");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey());
        }
    }
}

自己运行一下就能看到,输出顺序与插入顺序无关

2.遍历有序

public class HashMapTest {

    public static void main(String[] args) {
          HashMap<String, String> map1 = new HashMap<>();
        map1.put("Liyuanfang", "射手");
        map1.put("Yuange", "刺客");
        map1.put("Zhugeliang", "法师");
        map1.put("Xiahoudun", "坦克");
        map1.put("Guiguzi", "辅助");

        System.out.println("map1循环遍历:");
        for (map1.Entry<String, String> entry : map1.entrySet()) {
            System.out.println(entry.getKey());
        }
       
     HashMap<String, String> map2 = new HashMap<>();
        map2.put("Liyuanfang", "射手");
        map2.put("Yuange", "刺客");
        map2.put("Zhugeliang", "法师");
        map2.put("Xiahoudun", "坦克");
        map2.put("Guiguzi", "辅助");

        System.out.println("map2循环遍历:");
        for (map2.Entry<String, String> entry : map2.entrySet()) {
            System.out.println(entry.getKey());
        }
       
    }
}

两个Map,put的key值相同,但是两个Map最后循环遍历输出的key顺序却不一样。

3.HashMap的一些特性

  • HashMap的数据结构:数组+单链表,当存在hashCode相同的不同对象时,会将value以单链表的形式,往后追加。数组加快访问速度,单链表解决hash值冲突
  • 调用put方法时,发生了什么:根据key的hashCode,计算出将key放入数组的index下标,index= (数组长度 - 1) & hashCode
  • HashMap循环遍历的顺序:根据数组顺序+单链表顺序进行输出。虽然遍历时,用的EntrySet,但是可以简单理解为,两层循环输出数据,外层循环为遍历数组,内层循环为遍历单链表
  • HashMap在初始化时,默认初始容量为16,以及默认的扩容因子0.75

4.分析

基于HashMap的特性:

HashMap<String, String> map2 = new HashMap<>(map1.size());

即:map2的初始化容量=map1.size()。
这个设置,导致相同的key,在put到map2时,计算出的index值,与map1中的不一样
因为计算index时,依赖于数组的长度(参考上面:put方法调用说明)

5.结论

  • 若两个Map的初始化容量不一致,就算同时插入相同的key,最后输出的顺序,不一定一致
  • 想要依赖Map保持有序性,请使用LinkedHashMap 或 直接new HashMap<>()

第二个代码段,如果将:

HashMap<String, String> map2 = new HashMap<>(map1.size());

修改成:

HashMap<String, String> map2 = new HashMap<>();

那么 map1 和 map2的输出顺序是一致的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值