0

最近、次のコードをfor-each から Iteratorに変更しました ( iterator.remove()を使用)

ヒープスペースのメモリの問題をすぐに解決しました。

誰かがiterator.remove()が本当にどのように役立ったか説明できますか??

final Iterator<Entry<String, String>> metaTagIterator = localeDO.getMetaTags().entrySet().iterator();

while (metaTagIterator.hasNext()) {
    final Entry<String, String> entry = metaTagIterator.next();

    if (ImportUtil.isI18nLiferayLayoutProperty(entry.getKey())) {
        layoutProps.setProperty(entry.getKey() + StringPool.UNDERLINE + locale, entry.getValue());
    } else if (ImportUtil.isLiferayLayoutProperty(entry.getKey())) {
        layoutProps.setProperty(entry.getKey(), entry.getValue());
    } else {
        myCustomLayoutProps.setProperty(entry.getKey() + StringPool.UNDERLINE + locale, entry.getValue());
    }
    metaTagIterator.remove();
}
4

2 に答える 2

0

layoutProps値を設定してより多くのメモリをmyCustomLayoutProps消費している間に私ができる唯一のことは、要素を同時に削除してmetaTagIterator.remove();メモリを解放することです。このようにして、反復中に必要なメモリを節約できます。localeDO.getMetaTags()

于 2012-11-20T15:18:57.547 に答える
0

基になるコレクションから、反復子によって返された最後の要素を削除します (オプションの操作)。このメソッドは、next への呼び出しごとに 1 回だけ呼び出すことができます。反復の進行中に、このメソッドを呼び出す以外の方法で基になるコレクションが変更された場合、反復子の動作は規定されていません。

ここでは特別なことは何もありません。反復して削除すると、そのオブジェクトはコレクションから削除され、アクティブな参照がない場合は、GC で使用できるようになります。

于 2012-11-20T15:23:58.033 に答える