我是java的新手,所以请帮忙指导优化声明java地图的方法
情况1:如果在一个循环内部声明一个java映射。情况2:如果在循环外部声明一个Java映射。
Map<String, String> input = new HashMap<String, String>();
for (Document doc : docList) {
}
哪种情况是更优化(最佳实践)的声明方式,为什么?
AJ
我是java的新手,所以请帮忙指导优化声明java地图的方法
情况1:如果在一个循环内部声明一个java映射。情况2:如果在循环外部声明一个Java映射。
Map<String, String> input = new HashMap<String, String>();
for (Document doc : docList) {
}
哪种情况是更优化(最佳实践)的声明方式,为什么?
AJ
那么它取决于您的使用 - 如果你需要新的Map
每次迭代然后循环else外面它初始化。
既然你在这两个之间混淆 - 我相信你应该与案例2 - 因为它只会初始化Map
只有一次,如果你在循环中初始化它,那么Map
将无法访问循环。
我也认为如果你解释你在做什么Map
实例会更有帮助。
这取决于。取决于你想达到的目标。
for (Document doc : docList) {
Map input = new HashMap();
}
这对每次迭代都很有用,您需要有一个完全不同的值的新地图。
Map input = new HashMap();
for (Document doc : docList) {
}
当您想将先前迭代的值用于下一次迭代时,这会很有用。
同样在第二种情况下,即使在循环之后,地图也可供您使用。首先,一旦循环结束,您将无法访问地图,
我想知道哪种情况会需要更多的内存?案例1,它会为每次迭代创建一个新的地图对象吗?如果是,那么当这些对象将被销毁A.当循环移动到下一个条目或B。它将它保存在内存中并等待GC – VirtualLogic
这取决于您要存储的元素的数量。但是,是的,在第一种情况下,对于每次迭代,jvm都必须创建一个新的HashMap引用,而第二个引用将具有相同的引用。 堆中的对象一旦超出范围就不会被销毁。他们被GC销毁。他们的参考被立即删除。 – Garbage
请访问http://javaprepare.blogspot.com/2007/08/whats-differences-between-object-and.html以了解有关“对象”和“参考”之间差异的更多信息 – Garbage
当您在第二个循环中退出循环时,地图超出范围;除非将其分配给其他内容,否则它符合GC的条件。
如果你打算在其他地方使用它,你必须去#1。
其他人已经解释过需要在循环中声明它,如果每次迭代需要一个。这里有一个例子:
List<Map> maps = new ArrayList<Map>();
for (int i = 0; i < 10; ++i) {
Map temp = new HashMap();
maps.add(temp);
}
其实在你的情况没有优化点,因为,两者都不相同。您可能想知道哪一个更适合以下情况。
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>();
}
在这种情况下,第一个是小优化,因为该声明并将它们映射一次,但初始化它在文档列表中的每个条目的。
第一种方法会招致实质性的客体流失(特别是如果您的收藏docList
很大)。 Java对象分配是一项相对昂贵的操作,并且该对象流失导致的垃圾收集开销也会影响您的性能。
第二种方法将一遍又一遍地重复使用相同的地图(只要确保在每次新的迭代之前不要忘记清空它)。
使用第二种方法在性能方面几乎总是更好,但是第一种方法使得它在代码中变得更清洁,您不希望在循环之外使用Map
(它具有更窄的范围) ,我有时认为这是一件好事。从本质上讲,我的结论是:
Map
的可见性范围,否则选项2,或者如果您真的担心获得最佳性能。如果我们每次迭代都有相同的密钥情况1: 'String key1 =“key1”; String key2 =“key2”; (Document doc:docList) { \t Map
@ user1453247通过使用选项2可以获得最佳性能,甚至可以在迭代之间跳过清理地图。 – Romain
这些是非常不同的事情 - 考虑一下。 –