2019独角兽企业重金招聘Python工程师标准>>>
##HashMap不是有序的 java1.8重新修改了HashMap,结构变为数组+链表+红黑树(链表>8).因此,顺序取决于hash。
@Test
public void testHashMapShouldBeOrderedButNotAlpha(){
Map unsortMap = new HashMap<>();
unsortMap.put("z", 10);
unsortMap.put("a", 6);
unsortMap.put("d", 1);
unsortMap.put("e", 7);
unsortMap.put("b", 5);
unsortMap.put("f", 8);
unsortMap.put("n", 99);
unsortMap.put("j", 50);
unsortMap.put("c", 20);
unsortMap.put("m", 2);
unsortMap.put("f", 9);
Assert.assertEquals("{a=6, b=5, c=20, d=1, e=7, f=9, z=10, j=50, m=2, n=99}",
unsortMap.toString());
}
##使用stream排序收集为LinkedHashMap 因此,如果想要有序的map则必须转换成LinkedHashMap
@Test
public void testHashMapSortByValueDesc(){
Map unsortMap = new HashMap<>();
unsortMap.put("z", 10);
unsortMap.put("b", 5);
unsortMap.put("a", 6);
unsortMap.put("c", 20);
unsortMap.put("d", 1);
unsortMap.put("e", 7);
unsortMap.put("y", 8);
unsortMap.put("n", 99);
unsortMap.put("j", 50);
unsortMap.put("m", 2);
unsortMap.put("f", 9);
LinkedHashMap orderMap = unsortMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
Assert.assertEquals("{n=99, j=50, c=20, z=10, f=9, y=8, e=7, a=6, b=5, m=2, d=1}",
orderMap.toString());
}
###参考
- Java8系列之重新认识HashMap
- Sort a Map
by values (Java)