次のようにSet
/ HashSet
なしでどのように反復できますか?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
31
イテレータの使用を実際に避けようとしているのですか、それともソースコードでイテレータを見たくないだけですか?
—
ジョンスキート
コードをより短く、よりクリーンにすることができますが、イテレーターを使用する必要があります。それを避けたい理由はありますか?
—
Peter Lawrey 2012
記録のためと、イテレータを回避する理由の説明として:私は現在、Javaで記述されたAndroidゲームでその問題に直面しています。現在、私はHashSetを使用して、イベントについて定期的に通知される必要があるリスナーを格納しています。ただし、コレクションを繰り返し反復すると、ガベージコレクタのアクティビティが大量に発生し、ゲームループに負担がかかる可能性があります。そして、それはJavaゲームではノーゴーです。これらの部分を書き直します。
—
tiguchi
@thecoshman定期的にゲームの状態を更新している間は、GCを絶対に避けたいJavaゲーム開発の観点からのみ話しています。イテレータは、最初にリセットできないため、一時的に役立つオブジェクトであり、反復メソッドの呼び出しごとに再作成されます(たとえば、ArrayList.javaソースを参照)。ゲームループでシーンオブジェクトを反復し、1秒あたり少なくとも30回の更新を考慮すると、GCを待機しているメモリ内で1秒あたり60回(シーンは通常、サイクルごとに2回反復されます)の反復子オブジェクトになります。これはAndroidに大きな影響を与えます。
—
tiguchi 14年
その場合、おそらくより適切なデータ構造を選択する必要がありますか?セットは効率的に反復するように設計されていません。ArrayListを使用せずに、標準のforループで反復しませんか?追加のイテレータは作成されず、読み取りアクセスは非常に高速です。
—
stef77 2015