0

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

情况 1:如果 a 在循环内声明一个 java 映射。

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

情况 2:如果 a 在循环外声明一个 java 映射。

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

}

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

阿杰

4

5 回答 5

4

好吧,这取决于您的使用情况-如果Map每次迭代都需要新的,则在循环之外进行初始化。
由于您在这两者之间感到困惑 - 我相信您应该使用案例 2 - 因为它只会初始化Map一次,如果您在循环中初始化它,那么Map将无法在循环外访问。我还认为,如果您解释一下您对该实例
所做的事情,将会更有帮助。Map

于 2012-06-13T09:25:45.997 回答
3

这取决于。取决于你想要达到什么。

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

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

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

}

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

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

于 2012-06-13T09:28:23.617 回答
0

当您在第二个中退出循环时,地图超出范围;除非您将其分配给其他东西,否则它有资格获得 GC。

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

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

List<Map> maps = new ArrayList<Map>();
for (int i = 0; i < 10; ++i) {
    Map temp = new HashMap();
    maps.add(temp);
}
于 2012-06-13T09:30:14.100 回答
0

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

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

或者

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

在这种情况下,第一个几乎没有优化,因为声明它们映射一次,但为 docList 中的每个条目初始化它。

于 2012-06-13T09:31:21.633 回答
0

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

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

使用第二种方法在性能方面几乎总是更好,但是第一种方法使您的代码更清晰,您不打算在Map循环之外使用它(它的范围更窄),我有时会考虑一件好事。本质上,我的结论是:

  1. 如果您的文档集合可能很大,请使用选项 2。
  2. 如果您的文档集合保证很小,如果您希望您的代码非常明确地说明Map的可见性范围,请使用选项 1,否则使用选项 2,或者如果您真的关心获得最佳性能。
于 2012-06-13T09:31:58.570 回答