2012-06-13 53 views
0

我是java的新手,所以请帮忙指导优化声明java地图的方法

情况1:如果在一个循环内部声明一个java映射。情况2:如果在循环外部声明一个Java映射。

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

} 

哪种情况是更优化(最佳实践)的声明方式,为什么?

AJ

+3

这些是非常不同的事情 - 考虑一下。 –

回答

4

那么它取决于您的使用 - 如果你需要新的Map每次迭代然后循环else外面它初始化。
既然你在这两个之间混淆 - 我相信你应该与案例2 - 因为它只会初始化Map只有一次,如果你在循环中初始化它,那么Map将无法​​访问循环。
我也认为如果你解释你在做什么Map实例会更有帮助。

3

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

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

这对每次迭代都很有用,您需要有一个完全不同的值的新地图。

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

} 

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

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

+0

我想知道哪种情况会需要更多的内存?案例1,它会为每次迭代创建一个新的地图对象吗?如果是,那么当这些对象将被销毁A.当循环移动到下一个条目或B。它将它保存在内存中并等待GC – VirtualLogic

+0

这取决于您要存储的元素的数量。但是,是的,在第一种情况下,对于每次迭代,jvm都必须创建一个新的HashMap引用,而第二个引用将具有相同的引用。 堆中的对象一旦超出范围就不会被销毁。他们被GC销毁。他们的参考被立即删除。 – Garbage

+0

请访问http://javaprepare.blogspot.com/2007/08/whats-differences-between-object-and.html以了解有关“对象”和“参考”之间差异的更多信息 – Garbage

0

当您在第二个循环中退出循环时,地图超出范围;除非将其分配给其他内容,否则它符合GC的条件。

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

其他人已经解释过需要在循环中声明它,如果每次迭代需要一个。这里有一个例子:

List<Map> maps = new ArrayList<Map>(); 
for (int i = 0; i < 10; ++i) { 
    Map temp = new HashMap(); 
    maps.add(temp); 
} 
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>(); 
} 

在这种情况下,第一个是小优化,因为该声明并将它们映射一次,但初始化它在文档列表中的每个条目的。

0

第一种方法会招致实质性的客体流失(特别是如果您的收藏docList很大)。 Java对象分配是一项相对昂贵的操作,并且该对象流失导致的垃圾收集开销也会影响您的性能。

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

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

  1. 如果您的文档集可能会很大,使用选项2
  2. 如果您的文档集,保证是小,使用选项1,如果你想你的代码是非常明确说明Map的可见性范围,否则选项2,或者如果您真的担心获得最佳性能。
+0

如果我们每次迭代都有相同的密钥情况1: 'String key1 =“key1”; String key2 =“key2”; (Document doc:docList) { \t Map input = new HashMap (); \t input.put(key1,“value1”); \t input.put(key2,“value2”); \t dosomthing(); }' 案例2: 'String key1 =“key1”; String key2 =“key2”; Map input = new HashMap (); (document doc:docList) { \t input.put(key1,“value1”); \t input.put(key2,“value2”); \t dosomthing(); }' – VirtualLogic

+0

@ user1453247通过使用选项2可以获得最佳性能,甚至可以在迭代之间跳过清理地图。 – Romain