title: java.util.ConcurrentModificationException when removing elements from a hashmap
body: <p>I am learning about <code>HashMap</code> class and wrote this simple program.
  this code works good for adding elements to the hashmap and while removing elements from the hashmap , I am encountering <code>java.util.ConcurrentModificationException</code> 
   for example here is a copy of my terminal,</p>
  
  <pre><code>[ravi@doom test]$ java TestHashMap 
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :1
  
   Key : A
  
   Value : 1
  Key/Value : (A,1) added to storage.
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :1
  
   Key : B
  
   Value : 2
  Key/Value : (B,2) added to storage.
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :1
  
   Key : C
  
   Value : 3
  Key/Value : (C,3) added to storage.
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :1
  
   Key : D
  
   Value : 4
  Key/Value : (D,4) added to storage.
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :4
  ( D , 4 );
  ( A , 1 );
  ( B , 2 );
  ( C , 3 );
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :2
  Key to REMOVE : 
  D
  Pair (D,4) Removed.
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :4
  ( A , 1 );
  ( B , 2 );
  ( C , 3 );
  .....MENU.....
  1. Add
  2. remove key
  3. remove value
  4. display
  7. Exit
  Your choice :3
  Enter Value to remove : 2
  Key : B Removed.
  Exception in thread "main" java.util.ConcurrentModificationException
      at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
      at java.util.HashMap$EntryIterator.next(HashMap.java:962)
      at java.util.HashMap$EntryIterator.next(HashMap.java:960)
      at TestHashMap.start(TestHashMap.java:60)
      at TestHashMap.main(TestHashMap.java:87)
  ABRT problem creation: 'success'
  </code></pre>
  
  <p><strong>code:</strong></p>
  
  <pre><code>import java.util.HashMap;
  import java.util.Map;
  import java.util.Scanner;
  
  class TestHashMap
  {
      private Map&lt;String,Integer&gt; map;
      public TestHashMap()
      {
          map = new HashMap&lt;String,Integer&gt;();
      }
      public void displayMenu()
      {
          System.out.println(".....MENU.....");
          System.out.println("1. Add");
          System.out.println("2. remove key");
          System.out.println("3. remove value");
          System.out.println("4. display");
          System.out.println("7. Exit");
          System.out.print("Your choice :");
      }
      public void start()
      {
          Scanner input = new Scanner(System.in);
          int menuChoice,value;
          String key;
          while(true)
          {
              displayMenu();
              menuChoice = input.nextInt();
              switch(menuChoice)
              {
                  case 1:
                      System.out.print("\n Key : ");
                      input.nextLine();
                      key = input.nextLine();
                      System.out.print("\n Value : ");
                      value = input.nextInt();
                      map.put(key,new Integer(value));
                      System.out.println("Key/Value : ("+key+","+value+") added to storage.");
                  break;
                  case 2:
                      System.out.println("Key to REMOVE : ");
                      input.nextLine();
                      key = input.nextLine();
                      Integer v = map.get(key);
                      if(v == null)
                          System.out.println("No value exists for key "+key);
                      else
                      {
                          map.remove(key);
                          System.out.println("Pair ("+key+","+v.intValue()+") Removed.");
                      }
                      break;
                  case 3:
                      System.out.print("Enter Value to remove : ");
                      value = input.nextInt();
                      if(map.containsValue(new Integer(value)))
                      {
                          for(Map.Entry&lt;String,Integer&gt; entry : map.entrySet() )
                          {
                              if(entry.getValue().intValue() == value)
                              {
                                  System.out.println("Key : "+entry.getKey()+" Removed.");
                                  map.remove(entry.getKey());
                              }
                          }
                      }
                  break;
                  case 4:
                      for(Map.Entry&lt;String,Integer&gt; entry : map.entrySet() )
                      {
                          System.out.println("( "+entry.getKey()+" , "+entry.getValue()+" );");
                      }
                  break;
                  case 7:
                      input.close();
                      System.exit(0);
                  default:
                      System.out.println("Invalid Choice !");
              }
          }
      }
      public static void main(String args[])
      {
          TestHashMap thm = new TestHashMap();
          thm.start();
      }
  }
  </code></pre>
  
  <p><strong>UPDATE</strong>: working code</p>
  
  <p>thanks to both (<em>rgettman</em>,<em>Nathan Hughes</em>) of you.</p>
  
  <pre><code>import java.util.HashMap;
  import java.util.Map;
  import java.util.Scanner;
  import java.util.Iterator;
  
  class TestHashMap
  {
      private Map&lt;String,Integer&gt; map;
      public TestHashMap()
      {
          map = new HashMap&lt;String,Integer&gt;();
      }
      public void displayMenu()
      {
          System.out.println(".....MENU.....");
          System.out.println("1. Add");
          System.out.println("2. remove key");
          System.out.println("3. remove value");
          System.out.println("4. display");
          System.out.println("7. Exit");
          System.out.print("Your choice :");
      }
      public void start()
      {
          Scanner input = new Scanner(System.in);
          int menuChoice,value;
          String key;
          while(true)
          {
              displayMenu();
              menuChoice = input.nextInt();
              switch(menuChoice)
              {
                  case 1:
                      System.out.print("\n Key : ");
                      input.nextLine();
                      key = input.nextLine();
                      System.out.print("\n Value : ");
                      value = input.nextInt();
                      map.put(key,new Integer(value));
                      System.out.println("Key/Value : ("+key+","+value+") added to storage.");
                  break;
                  case 2:
                      System.out.println("Key to REMOVE : ");
                      input.nextLine();
                      key = input.nextLine();
                      Integer v = map.get(key);
                      if(v == null)
                          System.out.println("No value exists for key "+key);
                      else
                      {
                          map.remove(key);
                          System.out.println("Pair ("+key+","+v.intValue()+") Removed.");
                      }
                      break;
                  case 3:
                      System.out.print("Enter Value to remove : ");
                      value = input.nextInt();
                      if(map.containsValue(new Integer(value)))
                      {
                          for (Iterator&lt;Map.Entry&lt;String, Integer&gt;&gt; it = map.entrySet().iterator();it.hasNext();) 
                          {
                              Map.Entry&lt;String,Integer&gt; x = it.next();
                              if(x.getValue().intValue() == value)
                              {
                                  key = x.getKey();
                                  it.remove();
                                  System.out.println("Key : "+key+" Removed.");
                              }
                          }
                      }
                  break;
                  case 4:
                      for(Map.Entry&lt;String,Integer&gt; entry : map.entrySet() )
                      {
                          System.out.println("( "+entry.getKey()+" , "+entry.getValue()+" );");
                      }
                  break;
                  case 7:
                      input.close();
                      System.exit(0);
                  default:
                      System.out.println("Invalid Choice !");
              }
          }
      }
      public static void main(String args[])
      {
          TestHashMap thm = new TestHashMap();
          thm.start();
      }
  }
  </code></pre>