各位大佬,问个java基础的问题
外面定义了个map,
循环里,取每个字典的列表,tree
并把tree,放入map中,
原来是没有被我圈起来的代码,
但是,把这个MAP返回给前端时,tree里面的顺序竟然发生变化了,查的时候sql按指定字段order by 了,断点看,在放入map前顺序是正确的,但就是返回给前端后,就不行了。
最后不行就加了圈住部分的代码(n年前遇到过类似问题,就是这么解决的😂),map里不再放tree对象了,改放dictList了,问题解决了,
想问问各位大佬,这种现象作何解释。
这个问题在很早之前,刚参加工作时,遇到过一次,当初是把List转成了ArrayList解决的,但当时没追究为什么,过了几年了,又让遇到这种问题了,就想追究一下,为什么会出现这种情况,自己也写代码尝试了,重现不了
Link hashmap用这个
ArrayList是随机排序的,LinkedList是插入顺序的。
上述for循环也是随机抽取,HashMap的key也是随机排序的。
如若需要可自定义排序器。
加个调试输出一下,应该是程序问题,或者是前端把序列化问题
.....用linkedlist解决就好了啊
map里面的value使用object接收 应该考虑一下是不是list<Dict>转object时导致结构发生变化
然后json解析时导致顺序有可能发生变化
还有就是确认tree中的顺序就是你想要的顺序嘛
可否看一下DictCache.getList(d.getCode())方法的内部实现?
题主这个问题可以说是非常经典的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。
wireshark或Fiddler抓包看一下,界定一下是前端问题,还是后端问题。