私はこの状況にあります:HashSetで特定の値を見つけたら、フィールドを更新し、セットをクリアしてフィールドを返す必要があります。後で、私はセットを再利用する必要があるという事実を考えると、それは安全ですセットにこれを行う場合、私は思ったんだけど正しい値が見つかるとSetをループでクリアしても安全ですか?
static Set<Integer> testSet = new HashSet<>();
static Integer myField = null; // the field could be already != null
public static int testClearSet()
{
for (int i = 0; i < 100; i++) { // this is just for the test
testSet.add(i);
}
for (Integer n : testSet) {
if (n == 50) {
myField = n;
testSet.clear();
return myField;
}
}
return -1;
}
:ここでは一例 。
私はこれを聞いています。反復しながらコレクションを変更することを知っていたので、「良い練習」ではありませんが、このケースは少し違うと思います。
可能な解決策は、次のようになります。だから、
boolean clear = false;
for (Integer n : testSet) {
if (n == 50) {
myField = n;
clear = true;
break;
}
}
if (clear) {
testSet.clear();
return myField;
}
、正しい方法は一つですか?
あなたの解決策は大丈夫だと思います。内側がnまたは50に戻り、コードが少なくなると内側が変わり、常に50を返します。だから大丈夫です。 – Raskayu
'iterator'が' clear() 'の後で使用され、その内部状態がSetと一致しない場合、イテレータによって送出されたConcurrentModificationExceptionが発生した場合にのみ有効です。 –