这两种Java对象初始化方式有什么区别?

3

如果我使用:

    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 set = tokens.entrySet();
Iterator ik = test.iterator();

    while(ik.hasNext()){
      Map.Entry me = (Map.Entry)ik.next();
      System.out.println(me.getKey() + " : " + me.getValue() );

结果未经排序,结果为:

三: 3 一: 5 二: 1

遵循什么规则??输出随机显示是否正常?


1
你在这里提出了完全不同的问题——一个是关于泛型,另一个是关于映射。 - Matt Ball
5个回答

7

在第一种情况下,Hashmap的键必须是字符串,值必须是整数。编译器将执行相应的类型检查。在第二种情况下,可以使用任何类型的对象。

你的HashMap条目以随机顺序打印是完全正常的。如果要保留顺序,请使用LinkedHashMap。


2
在第一个示例中,您只能将字符串放入键中,并将整数放入值中,但在第二个示例中,您可以将任何内容放入映射中,编译器无法帮助您获得类型安全性。
了解有关Java泛型如何工作的更多信息,请阅读Java Generics

1

是的,使用HashMap时会得到“随机”的迭代顺序。如果您需要具有可预测迭代顺序的Map实现,请查看LinkedHashMap


0
在第一种情况下,键必须是字符串,值必须是整数。
在第二种情况下,键和值可以是任何类型的对象。
HashMap和HashSet不能保证插入顺序。如果您希望它保持您插入值的顺序,请尝试使用LinkedHashMap。更清楚的解答在之前的StackOverflow问题处

0

我认为这取决于您的用途, 如果您需要编译器允许您仅添加字符串作为键和整数作为值,则需要指定两个参数类型, 否则,如果您需要传递任何东西而没有任何限制,请使用第二个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接