java中这两个对象初始化有什么区别?

时间:2010-11-28 21:20:20

标签: java generics

如果我使用:

    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

它遵循什么规则?输出的这种正常行为是否随机显示?

5 个答案:

答案 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作为值,那么你需要指定两个参数类型, 否则,如果您需要通过任何限制,请使用第二个。