关于Spring List 返回给前端后,顺序不对了

行者爷爷 发布于 2021/12/09 17:02
阅读 1K+
收藏 2


各位大佬,问个java基础的问题
外面定义了个map,
循环里,取每个字典的列表,tree
并把tree,放入map中,
原来是没有被我圈起来的代码,
但是,把这个MAP返回给前端时,tree里面的顺序竟然发生变化了,查的时候sql按指定字段order by 了,断点看,在放入map前顺序是正确的,但就是返回给前端后,就不行了。

最后不行就加了圈住部分的代码(n年前遇到过类似问题,就是这么解决的😂),map里不再放tree对象了,改放dictList了,问题解决了,
想问问各位大佬,这种现象作何解释。
这个问题在很早之前,刚参加工作时,遇到过一次,当初是把List转成了ArrayList解决的,但当时没追究为什么,过了几年了,又让遇到这种问题了,就想追究一下,为什么会出现这种情况,自己也写代码尝试了,重现不了

以下是问题补充:

@行者爷爷:断点也跟踪了,在程序里面断点看到的数据,都是正确的,目前怀疑是JSON格式化的问题,这个问题也不是必出现,换台电脑竟然好了,然后再用原来电脑试呢,又不出现了,N前年遇到这个问题是服务器上有问题,本地没事,现在想重现这个问题,又重现不了了,崩溃 (2021/12/10 16:20)
加载中
0
13123123
13123123

Link hashmap用这个

行者爷爷
行者爷爷
不是Map里的数据乱了,是List里的顺序乱了,,
0
ducat7
ducat7

ArrayList是随机排序的,LinkedList是插入顺序的。

上述for循环也是随机抽取,HashMap的key也是随机排序的。

如若需要可自定义排序器。

wad12302
wad12302
回复 @行者爷爷 : 我感觉arraylist 也是按照插入顺序应该不会乱的啊
行者爷爷
行者爷爷
list都应该是有序的吧,
0
@ccny
@ccny

加个调试输出一下,应该是程序问题,或者是前端把序列化问题

行者爷爷
行者爷爷
感觉像是后端后端向前端返回数据时出问题了,怀疑是JSON格式化的问题。
0
13123123
13123123

.....用linkedlist解决就好了啊

0
熟也不生巧
熟也不生巧

map里面的value使用object接收   应该考虑一下是不是list<Dict>转object时导致结构发生变化

然后json解析时导致顺序有可能发生变化

还有就是确认tree中的顺序就是你想要的顺序嘛

0
M
MkHz

可否看一下DictCache.getList(d.getCode())方法的内部实现?

-1
清帝
清帝
搞不好是你的sql没做排序,所以每次顺序都是随机的。
-1
ArchitectureMaster
ArchitectureMaster

题主这个问题可以说是非常经典的hashmap问题,楼上几位说得很对,问题出来你把Code作为key添加至Hasmap这段:

你这个code和list组成的字典,放进去的顺序和遍历出来的顺序是不一样的。和key值无关,而是key的hashCode。而你如果直接把字典循环出来是按其key的hashcode排序的。key值的设计一定不能重复!

因为不能保证你的key生成的hashcode是一个什么样的顺序,所以正常值是无法保证存储的顺序的。

当然还有一个方法就是逆向取值。打比方1可以生成hashcode为20,2可以生成12你可以把hashcode的结果排序、这样你的code的第一个进入的是2,第二个进入的是1。这样取出来的一定是2,1。这样也能保存你存入和取出是一致的。但这样做你的code就没有意义。而且也不是正常的值。

所以基本上很多人的思路就是使用HashMap的子类LinkedHashMap,而这个存储进入的顺序,取出也是这个顺序。

1.当然hashmap这样设计的意义并不是建议题主这样来使用,hashmap作为快速取出的单个值。或索引部分值。所以设计取出的效率会比arraylist + lamda  要高出十倍,比arraylist + for in + if条件找出也要高出数倍。

2.不同的数据类型设计出来是有意义的不要混用,如果题主这种最好的推荐是TreeMap。

行者爷爷
行者爷爷
在后台debug时,顺序都是正常的,但返回到前端的json里的顺序就是变了。
行者爷爷
行者爷爷
不是map乱序,而是放进去的List顺序变了
-1
osc_27902854
osc_27902854

wireshark或Fiddler抓包看一下,界定一下是前端问题,还是后端问题。

10进制宇宙
10进制宇宙
Postman: 这种事情要出动Wireshark?
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部