关于作业第4道编程题的一些总结:
在Java中,HashMap
本身不保证元素的顺序。这意味着当你向 HashMap
中插入键值对时,它们在内存中的存储顺序可能会在不同的运行中或者在同一个运行的不同时间点发生变化。
然而,从Java 8开始,HashMap
的实现在内部使用链表和红黑树来维护条目的顺序,使得在大多数情况下,HashMap
会按照插入顺序来遍历条目。但是,这种顺序的保证并不是 HashMap
规范的一部分,因此不应该依赖于它。
如果你需要一个保证顺序的 Map
实现,你应该使用 LinkedHashMap
。LinkedHashMap
维护了元素的插入顺序,或者在构造时指定的顺序(例如访问顺序)。这意味着当你遍历 LinkedHashMap
时,元素将会按照它们被插入的顺序(或者访问的顺序,如果你在构造时指定了访问顺序)来返回。
所以此处应选择LinkedHashMap。
同时,在下列代码中:
public static void main(String[] args) {
//1、创建一个HashMap,键为商品类型,值是不同的品牌
Map<String, Set<String>> products = new LinkedHashMap<>();
// 添加电脑品牌,为了保证是按插入数据的顺序输出,所以应该使用LinkedHashSet,
// 同时Set.of()方法添加时并不会保证顺序,故此处应采用Arrays.asList来初始化LinkedHashSet
//products.put("电脑", new LinkedHashSet<>(Set.of("华为电脑", "苹果电脑", "oppo电脑", "vivo电脑", "三星电脑")));
products.put("电脑", new LinkedHashSet<>(Arrays.asList("华为电脑", "苹果电脑", "oppo电脑", "vivo电脑", "三星电脑")));
// 添加手机品牌
products.put("手机", new LinkedHashSet<>(Arrays.asList("华为手机", "苹果手机", "oppo手机", "vivo手机", "三星手机")));
// 添加耳机品牌
products.put("耳机", new LinkedHashSet<>(Arrays.asList("华为耳机", "苹果耳机", "华强北耳机", "oppo耳机", "vivo耳机", "三星耳机")));
//2、遍历HashMap并打印
products.forEach((type, brands) ->
{
System.out.print(type + "=[");
//这一步用来实现当打印集合中的最后一个元素后,不加逗号
Iterator<String> it = brands.iterator();
// 遍历集合
while (it.hasNext()) {
String brand = it.next();
System.out.print(brand);
if (it.hasNext()) {
System.out.print(",");
}
}
System.out.println("]");
});
}
可看到,关于HashSet的初始化,尽管LinkedHashSet是按顺序插入,但是Set.of()方法添加时并不会保证顺序,故此处应采用Arrays.asList来初始化LinkedHashSet