0

私は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

4

5 に答える 5

4

それはあなたの使い方に依存します -Map繰り返しごとに新しいものが必要な場合は、それ以外のループで初期化してください。
これら2つを混同しているため-ケース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) {

}

これは、前の反復の値を次の反復に使用する場合に役立ちます。

また、2番目のケースでは、ループの後でもマップを使用できます。まず、ループが終了すると、マップにアクセスできなくなります。

于 2012-06-13T09:28:23.617 に答える
0

2番目のループを終了すると、マップはスコープ外になります。他のものに割り当てない限り、GCの対象となります。

他の場所で使用する場合は、#1を使用する必要があります。

反復ごとに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>();
}

この場合、最初のものはほとんど最適化されていません。これは、それらのマップを 1 回宣言するが、docList のすべてのエントリに対して初期化するためです。

于 2012-06-13T09:31:21.633 に答える
0

最初のアプローチでは、かなりのオブジェクト チャーンが発生します (特にコレクションdocListが大きい場合)。Java オブジェクトの割り当ては全体的に比較的コストのかかる操作であり、そのオブジェクト チャーンによって発生するガベージ コレクションのオーバーヘッドもパフォーマンスに影響します。

2 番目のアプローチでは、同じマップを何度も再利用します (新しい反復のたびにマップを空にすることを忘れないようにしてください)。

ほとんどの場合、2 番目のアプローチを使用する方がパフォーマンスの点で優れていますが、最初のアプローチは、コード内でループの外で使用するつもりがないことを明確にしMapます (スコープが狭い)。良いこと。基本的に、私の結論は次のとおりです。

  1. ドキュメントのコレクションが大きくなる可能性がある場合は、オプション 2 を使用してください。
  2. Mapドキュメントのコレクションが小さいことが保証されている場合、コードでの可視性スコープを明確にしたい場合はオプション 1 を使用します。
于 2012-06-13T09:31:58.570 に答える