我是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
答案 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
在外部使用循环(它的范围较窄),我有时认为这是一件好事。基本上,我的结论是:
Map
的可见范围,则选择2,或者如果您&#39 ;真正关心的是获得最佳表现。