2

私のハッシュセットコードではConcurrentModificationException、誰かがイテレータの後に追加または削除しようとするとスローされるように実装したいと考えています。

コードの一部を次に示します。

          /** Need to add ConcurrentModificationException stuff*/
  public boolean hasNext()
  {
     if (current != null && current.next != null)
     {
        return true;
     }
     for (int b = bucketIndex + 1; b < buckets.length; b++)
     {
        if (buckets[b] != null)
        {
           return true;
        }
     }
     return false;
  }

   /** Need to add ConcurrentModificationException stuff*/
  public Object next()
  {
     if (current != null && current.next != null)
     {
        current = current.next; // Move to next element in bucket
     } else
     // Move to next bucket
     {
        do
        {
           bucketIndex++;
           if (bucketIndex == buckets.length)
           {
              throw new NoSuchElementException();
           }
           current = buckets[bucketIndex];
        } while (current == null);
     }
     return current.data;
  }
4

1 に答える 1

2

インスタンス変数を追加しますint modcount = 0addミューテーター (または などremove) が呼び出されるたびにインクリメントします。新しい反復子を作成するときは、そのインスタンス変数を設定しますint myModcount = modcount。そのnextメソッドで、if myModtcount != modcountthen throw a ConcurrentModificationException. (Java イテレーターがこれをメソッドでスローするとは思わず、hasNextメソッドでのみスローしますnext。)

理由は、これにより複数のイテレータを使用できるようになるためです。たとえば、

Iterator itr1 = hashMap.iterator();
hamMap.put(obj1, obj2);
Iterator itr2 = hashMap.iterator();

この時点でitr1.next()がスローされますがConcurrentModificationException、スローされitr2.next()ません。

イテレータがremoveまたはその他のミューテータを実装している場合、これらmyModcountは と同様にインクリメントされmodcountます。

于 2013-04-29T04:37:23.637 に答える