优化声明java映射的方法

优化声明java映射的方法,java,dictionary,Java,Dictionary,我是java新手,请提供帮助和指导 案例1:如果在循环中声明java映射 for (Document doc : docList) { Map<String, String> input = new HashMap<String, String>(); } Map<String, String> input = new HashMap<String, String>(); for (Document doc : docList) { }

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

案例1:如果在循环中声明java映射

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

}
案例2:如果在循环外声明java映射

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

}
哪种情况是最优化的声明实践方式?为什么


AJ

这取决于您的使用情况-如果每次迭代都需要新映射,那么在循环中初始化,或者在循环之外初始化。 由于您混淆了这两种情况—我相信您应该使用案例2—因为它只会初始化映射一次,如果您在循环中初始化它,那么映射将无法在循环外访问。
另外,我认为如果您解释一下您正在使用该地图实例做什么,会更有帮助。

这取决于您的情况。这取决于你想要实现什么

for (Document doc : docList) { 
  Map input = new HashMap();
}
对于每次迭代,需要有一个具有完全不同值的新映射时,这非常有用

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

}
当您希望在下一次迭代中使用上一次迭代的值时,这将非常有用


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

当您在第二种情况下退出循环时,映射将超出范围;它符合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>();
}


在这种情况下,第一种方法很少得到优化,因为它只声明了一次映射,但对docList中的每个条目都进行了初始化。

第一种方法将导致大量的对象搅动,尤其是当集合docList很大时。总体而言,Java对象分配是一项相对昂贵的操作,该对象搅动所产生的垃圾收集开销也会影响性能

第二种方法将一次又一次地重复使用相同的映射,只是确保在每次新迭代之前不要忘记清空它

使用第二种方法在性能方面几乎总是更好,但是第一种方法使代码中更干净,你不希望地图在循环之外使用,它有一个较窄的范围,有时我认为这是一件好事。基本上,我的结论是:

如果您的文档集合可能很大,请使用选项2。 如果您的文档集合保证很小,那么如果您希望代码非常明确地显示映射的可见性范围,请使用选项1;否则,请使用选项2,或者如果您真的希望获得尽可能好的性能,请使用选项1。
这些是完全不同的事情想想看,我想知道哪种情况需要更多的记忆?案例1,它会为每次迭代创建一个新的映射对象吗?如果是,那么这些对象将在什么时候被销毁A.循环移动到下一个条目或B.它将其保存在内存中并等待GCIt,这取决于您存储的元素数量。但是是的,在第一种情况下,对于每个迭代,jvm必须创建一个新的HashMap引用,而在第二种情况下,它将具有相同的引用。堆上的对象在超出范围时不会立即销毁。它们被GC破坏。他们的引用立即被删除。请访问以了解更多有关对象和引用之间的差异的信息,如果每个迭代案例都有相同的键1:String key1=key1;字符串key2=key2;对于文档文档:docList{Map input=new HashMap;input.putkey1,value1;input.putkey2,value2;dosomthing;}案例2:String key1=key1;字符串key2=key2;映射输入=新的HashMap;对于documentdoc:docList{input.putkey1,value1;input.putkey2,value2;dosomthing;}@user1453247,使用选项2可以获得最佳性能,甚至可以跳过在迭代之间清理映射。