今天在面试的时候,被面试官的一个问题很有意思,HashMap循环遍历时,输出顺序会不会改变?修改元素值会影响打印顺序吗?
我当时回答的是:循环遍历不会,但修改会影响打印顺序,因为修改后hashCode值发生了改变。 (这里回答的不对)
先拿事实说话,上代码:
Map<UserEntity,String> hashMap = new HashMap<UserEntity,String>();
UserEntity e = new UserEntity();
e.setAge(30);
e.setName("wangwu");
hashMap.put(e,"1");
hashMap.put(new UserEntity("wangwu",58),"2");
hashMap.put(new UserEntity("wangwu",20),"3");
hashMap.forEach((UserEntity,String) ->System.out.println(UserEntity.toString()+"---"+String));
System.out.println("修改后:---");
//hashMap.put(new UserEntity("hehe",18),"4");
e.setName("999");
e.setAge(800);
hashMap.forEach((UserEntity,String) ->System.out.println(UserEntity.toString()+"---"+String));
结果:
UserEntity{name='wangwu', age=30}---1
UserEntity{name='wangwu', age=58}---2
UserEntity{name='wangwu', age=20}---3
修改后:---
UserEntity{name='999', age=800}---1
UserEntity{name='wangwu', age=58}---2
UserEntity{name='wangwu', age=20}---3
修改不会影响打印顺序
原因:
因为HashMap的value的存储位置是通过HashCode的值确定的。但是,key是在数组中存放的,HashMap循环遍历的顺序是:根据数组顺序+单链表顺序进行输出。可以简单理解为,两层循环输出数据,外层循环为遍历数组,内层循环为遍历单链表。
所以我们修改的只是数组里的key的值,所以不会改变打印顺序的!