code: protected String getOrAddString(Object key) {
  
          String testValue;
          int    index      = hashIndex.getHashIndex(key.hashCode());
          int    lookup     = hashIndex.hashTable[index];
          int    lastLookup = -1;
  
          for (; lookup >= 0;
                  lastLookup = lookup,
                  lookup = hashIndex.getNextLookup(lookup)) {
              testValue = (String) objectKeyTable[lookup];
  
              if (key.equals(testValue)) {
                  if (accessCount == Integer.MAX_VALUE) {
                      resetAccessCount();
                  }
  
                  accessTable[lookup] = accessCount++;
  
                  return testValue;
              }
          }
  
          if (hashIndex.elementCount >= threshold) {
              reset();
  
              return getOrAddString(key);
          }
  
          testValue              = key.toString();
          lookup                 = hashIndex.linkNode(index, lastLookup);
          objectKeyTable[lookup] = testValue;
  
          if (accessCount == Integer.MAX_VALUE) {
              resetAccessCount();
          }
  
          accessTable[lookup] = accessCount++;
  
          return testValue;
      }
docs: This is dissimilar to normal hash map get() methods. The key Object
  should have an equals(String) method which should return true if the
  key.toString().equals(String) is true. Also the key.hashCode() method
  must return the same value as key.toString.hashCode().<p>
  
  The above is always true when the key is a String. But it means it is
  possible to submit special keys that fulfill the contract. For example
  a wrapper around a byte[] can be submitted as key to retrieve either
  a new String, which is the result of the toString() method of the
  wrapper, or return an existing String which would be equal to the result
  of toString().
  
  @param key String or other Object with compatible equals(String)
  and hashCode().
  @return String from map or a new String