如果我使用:
HashMap<String, Integer> test = new HashMap<String, Integer>();
或者我使用:
HashMap test = new HashMap();
我可以在测试对象上应用的其他方法有什么不同。像test.put(),test.get()等,如果初始化不同??
此外,如果我在测试对象中添加某些内容,例如:
test.put("One", new Integer(5));
test.put("Two", new Integer(4));
test.put("Three", new Integer(3));
并将其显示为:
设置set = tokens.entrySet();
Iterator ik = test.iterator();
while(ik.hasNext()){
Map.Entry me = (Map.Entry)ik.next();
System.out.println(me.getKey() + " : " + me.getValue() );
结果未排序,restul是:
三:3 一:5 二:1
它遵循什么规则?输出的这种正常行为是否随机显示?
答案 0 :(得分:7)
在第一种情况下,Hashmap键必须是字符串,值必须是整数。编译器将执行相应的类型检查。在第二种情况下,可以使用任何类型的对象。
以任意顺序打印HashMap条目是完全正常的。如果您想保留订单,请使用LinkedHashMap。
答案 1 :(得分:2)
在第一个示例中,您只能将字符串作为键和整数作为值,但在第二个示例中,您可以将任何内容放到地图中,编译器无法帮助您获得类型安全。
详细了解Java Generics的工作原理。
答案 2 :(得分:1)
是的,使用HashMap时,您将获得“随机”迭代顺序。如果您需要具有可预测迭代顺序的Map实现,请查看LinkedHashMap。
答案 3 :(得分:0)
在第一种情况下,key必须是String,value必须是Integer。
在第二种情况下,键和值可以是任何类型的对象。
HashMap和HashSet不保证插入顺序。如果希望它保持插入值的顺序,请尝试使用LinkedHashMap。之前StackOverflow question here
回答了更清楚的问题答案 4 :(得分:0)
我认为这取决于你的用法, 如果你需要一个编译器来允许你只将String添加为Key和Integer作为值,那么你需要指定两个参数类型, 否则,如果您需要通过任何限制,请使用第二个。