Moses DeJong writes:
> I wrote a little test program to double check that what I was doing
> was correct. I was using the Hashtable.keys() method to iterate a
> table and remove each key like the following example.
> 
> import java.util.*;
> 
> public class HashTest {
>     public static void main(String[] argv) {
>       Hashtable h = new Hashtable();
>       Enumeration search;
>       String elem;
> 
>       h.put("one", new Integer(1));
>       h.put("two", new Integer(2));
>       h.put("three", new Integer(3));
> 
>       for (search = h.keys(); search.hasMoreElements() ; ) {
>           elem = (String) search.nextElement();
> 
>           System.out.print("elem is \"" + elem + "\" value is " +
> h.get(elem) + " ... ");
>           h.remove(elem);
>           System.out.println("removed");
>       }
>     }
> }

FYI-
This works because the legacy routines (Hashtable.keys() and
Hashtable.elements()) take a "snapshot" of the hashtable (or
so it seems; this is not documented anywhere).

A more efficient way to do the above loop, using the Collections
framework, would be:

    import java.util.*;
    public class HashTest {
        public static void main(String[] argv) {
            Hashtable h = new Hashtable();

            h.put("one", new Integer(1));
            h.put("two", new Integer(2));
            h.put("three", new Integer(3));

            for (Iterator i = h.entrySet().iterator(); i.hasNext() ; ) {
                Map.Entry entry = (Map.Entry)i.next();
                Object key = entry.getKey();
                Object value = entry.getValue();

                System.out.print("key=" +key+ " value=" +value);
                i.remove();
                System.out.println(" removed");
            }
        }
    }

This avoids two ineffiencies:

  - Copying all of the keys into a separate list in Hashtable.keys()
  - Looking up each value for every key

-Archie

___________________________________________________________________________
Archie Cobbs   *   Whistle Communications, Inc.  *   http://www.whistle.com

Reply via email to