优化声明java映射的方式

时间:2012-06-13 09:24:00

标签: java dictionary

我是java的新手,请帮助和指导

案例1:如果在循环内声明一个java映射。

for (Document doc : docList) {
    Map<String, String> input = new HashMap<String, String>();
}

案例2:如果在循环外声明一个java映射。

Map<String, String> input = new HashMap<String, String>();
for (Document doc : docList) {

}

哪种情况更优化(最佳实践)宣言方式,为什么?

AJ

5 个答案:

答案 0 :(得分:4)

这取决于你的用法 - 如果你每次迭代都需要新的Map,那么在它之外的其他地方初始化。
由于你在这两者之间混淆 - 我相信你应该使用案例2 - 因为它只会初始化Map一次,如果你在循环中初始化它,那么Map将无法在循环中访问。
我认为如果你用Map实例解释你在做什么会更有帮助。

答案 1 :(得分:3)

这取决于。取决于你想要达到的目标。

for (Document doc : docList) { 
  Map input = new HashMap();
}

当每次迭代时,您需要拥有一个具有完全不同值的新地图。

Map input = new HashMap();
for (Document doc : docList) {

}

当您想要将先前迭代的值用于下一次迭代时,这将非常有用。

同样在第二种情况下,即使在循环之后,地图也可供您使用。首先,一旦循环结束,您将无法访问地图,

答案 2 :(得分:0)

当您在第二个循环中退出循环时,Map超出范围;除非您将GC指定给其他人,否则它有资格使用GC。

如果您打算在其他地方使用它,则必须使用#1。

如果每次迭代需要一个,那么其他人已经解释了在循环内声明它的必要性。这是一个例子:

List<Map> maps = new ArrayList<Map>();
for (int i = 0; i < 10; ++i) {
    Map temp = new HashMap();
    maps.add(temp);
}

答案 3 :(得分:0)

实际上在你的情况下没有优化点,因为,两者都不相同。在下列情况下,您可能想知道哪一个更好。

Map<String, String> input = null;
for (Document doc : docList) {
    input = new HashMap<String, String>();
}

OR

for (Document doc : docList) {
   Map<String, String> input = new HashMap<String, String>();
}

在这种情况下,第一个很少被优化,因为它们声明了一次map,但是为docList中的每个条目初始化它。

答案 4 :(得分:0)

第一种方法会产生大量的对象流失(特别是如果你的集合docList很大)。 Java对象分配总体上是一个相对昂贵的操作,并且该对象流失引起的垃圾收集开销也会影响您的性能。

第二种方法会一遍又一遍地重复使用相同的地图(只是确保在每次新的迭代之前不要忘记将其清空)。

使用第二种方法在性能方面几乎总是更好,但是第一种方法使代码更清晰,您不希望Map在外部使用循环(它的范围较窄),我有时认为这是一件好事。基本上,我的结论是:

  1. 如果您的文档集可能很大,请使用选项2。
  2. 如果您的文档集保证很小,请使用选项1,如果您希望代码明确Map的可见范围,则选择2,或者如果您&#39 ;真正关心的是获得最佳表现。