public boolean containsKey(int key) {
    int hash = key % capacity;
    IntToIntHashMapEntry e, tmp;

    for (tmp = null, e = data[hash]; e != null; tmp = e, e = e.next) {
      if (e.key == key) {
        /* Assume that it is likely that
         * an eventual call to get() for the same
         * key is near */
        if (tmp != null) {
          tmp.next = e.next;
          e.next = data[hash];
          data[hash] = e;
        }
        return true;
      }
    }

    return false;
  }
  private void rehash(int newCapacity) {
    if (newCapacity > capacity) {
      IntToIntHashMapEntry newData[];
      IntToIntHashMapEntry entry, tmp;
      int newHash;

      newData = new IntToIntHashMapEntry[newCapacity];
      for (int i = 0; i < capacity; i++) {
        for (entry = data[i]; entry != null; ) {
          tmp = entry.next;
          newHash = entry.key % newCapacity;
          entry.next = newData[newHash];
          newData[newHash] = entry;
          entry = tmp;
        }
      }

      data = newData;
      capacity = newCapacity;
      cutoff = (int) (newCapacity * loadFactor);
    }
  }
  public int remove(int key) {
    int hash = key % capacity;
    IntToIntHashMapEntry e, tmp;

    for (tmp = null, e = data[hash]; e != null; tmp = e, e = e.next) {
      if (e.key == key) {
        if (tmp == null) {
          data[hash] = e.next;
        } else {
          tmp.next = e.next;
        }
        int i = e.value;
        /*
        e.next = entryPool;
        entryPool = e;
        */
        e = null;
        size--;
        return i;
      }
    }

    return defaultValue;
  }