Question: Can we put hash tables inside a hash table?
Answer: How about    

Map&lt;String, Map&lt;Integer,Integer&gt;&gt; asdf = new HashMap&lt;String, Map&lt;Integer, Integer&gt;&gt;();


But to be honest you should start with wrapping it inside an object. In this structure globally will be very inconvenient.

You could try this BiHashMap

public class BiHashMap&lt;K1, K2, V&gt; {

private final Map&lt;K1, Map&lt;K2, V&gt;&gt; mMap;

public BiHashMap() {
    mMap = new HashMap&lt;K1, Map&lt;K2, V&gt;&gt;();
}

/**
 * Associates the specified value with the specified keys in this map (optional operation). If the map previously
 * contained a mapping for the key, the old value is replaced by the specified value.
 * 
 * @param key1
 *            the first key
 * @param key2
 *            the second key
 * @param value
 *            the value to be set
 * @return the value previously associated with (key1,key2), or &lt;code&gt;null&lt;/code&gt; if none
 * @see Map#put(Object, Object)
 */
public V put(K1 key1, K2 key2, V value) {
    Map&lt;K2, V&gt; map;
    if (mMap.containsKey(key1)) {
        map = mMap.get(key1);
    } else {
        map = new HashMap&lt;K2, V&gt;();
        mMap.put(key1, map);
    }

    return map.put(key2, value);
}

/**
 * Returns the value to which the specified key is mapped, or &lt;code&gt;null&lt;/code&gt; if this map contains no mapping for
 * the key.
 * 
 * @param key1
 *            the first key whose associated value is to be returned
 * @param key2
 *            the second key whose associated value is to be returned
 * @return the value to which the specified key is mapped, or &lt;code&gt;null&lt;/code&gt; if this map contains no mapping for
 *         the key
 * @see Map#get(Object)
 */
public V get(K1 key1, K2 key2) {
    if (mMap.containsKey(key1)) {
        return mMap.get(key1).get(key2);
    } else {
        return null;
    }
}

/**
 * Returns &lt;code&gt;true&lt;/code&gt; if this map contains a mapping for the specified key
 * 
 * @param key1
 *            the first key whose presence in this map is to be tested
 * @param key2
 *            the second key whose presence in this map is to be tested
 * @return Returns true if this map contains a mapping for the specified key
 * @see Map#containsKey(Object)
 */
public boolean containsKeys(K1 key1, K2 key2) {
    return mMap.containsKey(key1) &amp;&amp; mMap.get(key1).containsKey(key2);
}

public void clear() {
    mMap.clear();
}

}


And then create use it like this:

BiHashMap&lt;String,String,String&gt; bigBoard = new BiHashMap&lt;String,String,String&gt;();