Re: find words that contains some specific letters
 
John B. Matthews wrote:
Empirically, Java's hashCode() implementation for String generates just 
six potential collisions in my ~250K word list. That number surely 
increases when the hash code is used to index the implementation's 
bucket list, but performance is still excellent.
 
[1]<http://sites.google.com/site/drjohnbmatthews/jumble>
[2]<http://en.wikipedia.org/wiki/Jumble>
So a hash map even at a load factor of 1.0f with 250K entries would only have 
six buckets with more than one entry.  340K at the default .75f would be 
there, too.
There should be an optimization in the JVM for statically-generated 
non-mutable reference structures like the Map<String, Set<String>> reference. 
  Oh, yes, I'm sure there are, but I wonder if the JVM optimize such a complex 
space on its own, or if there's more opportunity in this area.  I'm thinking 
of a sort of constant pool that gets built and robotically compacted at 
class-initialization time so that it can optimize a statically-initialized 
dictionary structure or whatever.
Idioms that would benefit would include our jumble use case:
<code status="{untested, uncompiled, scratchpad}" complete="false" >
public class Jungle
{
  ...
  /** Thread-safe read-only lookup for word jungles. */
  private static final Map <String, Set <String>> jungles;
  static
  {
    Map <String, Set <String>> builder =
      new HashMap <String, Set <String>> ( NWORDS * 4 / 3 + 1 );
    for( String word : inputWords() )
    {
     final String sorted = sort( word ); // standard word sort
     Set <String> matches = builder.get( word );
     if ( matches == null )
     {
      matches = new HashSet <String> (); // or concurrent, ...
      builder.put( sorted, matches );
     }
     matches.add( word );
    }
    for ( Map.Entry <String, Set <String>> entry
              : builder.entrySet() )
    {
     Set <String> immutable = Collections.unmodifiableSet(
       entry.getValue() );
     entry.setValue( immutable );
    }
    jungles = Collections.unmodifiableMap( builder );
  }
  ...
}
</code>
HashSet<E>
<http://java.sun.com/javase/6/docs/api/java/util/HashSet.html>
HashMap<K,V>
<http://java.sun.com/javase/6/docs/api/java/util/HashMap.html>
ConcurrentHashMap<K,V>
<http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html>
Collections methods:
public static <K,V> Map<K,V>
synchronizedMap( Map<K,V> m ))
<http://java.sun.com/javase/6/docs/api/java/util/Collections.html#synchronizedMap(java.util.Map)>
public static <T> Set<T>
unmodifiableSet(Set<? extends T> s)
<http://java.sun.com/javase/6/docs/api/java/util/Collections.html#unmodifiableSet(java.util.Set)>
public static <K,V> Map<K,V>
unmodifiableMap(Map<? extends K,? extends V> m)
<http://java.sun.com/javase/6/docs/api/java/util/Collections.html#unmodifiableMap(java.util.Map)>
The Collections methods can be static imported.
-- 
Lew
AFAIK, no one has trademarked "jungle" for this sort of data representation.