[置顶] 记一次hashmap乱序的问题

时间:2021-07-15 16:01:15

首先交代一下背景,一个用户权限菜单按照数据库字段sort倒序排列,首先sql按照order by sort desc倒序传到前台中的数据没问题,但是将数据转为树节点(此代码是我维护),

简单看了下,他是采用Hashmap.而 Hashmap是无序,所以在网上查了下有序的map,,看到一个说Treemap是有序的,于是改用TreeMap,最后发现还是无序的,key是采用的String.

    于是查看源码

[置顶]        记一次hashmap乱序的问题


从源码中可以看到,是通过key的compareto方法进行比较的,于是查看String实现Comparable的接口compareTo的源码[置顶]        记一次hashmap乱序的问题


从源码中可以看到,String首先将较小长度的字符串与较长字符串比较(如  "abc"和"abcd"),若较小字符串与较长字符串的前几位都想等则较长字符串大,否则就是通过asc码来比较大小。所以TreeMap是不能记录元素的放入顺序的。


结果采用LinkedHashMap解决问题。LinkedHashMap是采用双向链表的方式记录插入的顺序