@Contract(pure = true)
  public @NotNull UnmodifiableHashMap<K, V> without(@NotNull K key) {
    int pos = data.length == 0 ? -1 : tablePos(strategy, data, key);
    if (pos >= 0) {
      Object[] newData = new Object[(size - 1) * 4];
      for (int i = 0; i < data.length; i += 2) {
        if (i == pos) continue;
        @SuppressWarnings("unchecked") K k = (K)data[i];
        if (k == null) continue;
        Object v = data[i + 1];
        insert(strategy, newData, k, v);
      }
      if (k1 != null) {
        insert(strategy, newData, k1, v1);
        if (k2 != null) {
          insert(strategy, newData, k2, v2);
          if (k3 != null) {
            insert(strategy, newData, k3, v3);
          }
        }
      }
      return new UnmodifiableHashMap<>(strategy, newData, null, null, null, null, null, null);
    }
    if (k1 != null) {
      if (strategy.equals(k1, key)) {
        return new UnmodifiableHashMap<>(strategy, data, k2, v2, k3, v3, null, null);
      }
      if (k2 != null) {
        if (strategy.equals(k2, key)) {
          return new UnmodifiableHashMap<>(strategy, data, k1, v1, k3, v3, null, null);
        }
        if (k3 != null) {
          if (strategy.equals(k3, key)) {
            return new UnmodifiableHashMap<>(strategy, data, k1, v1, k2, v2, null, null);
          }
        }
      }
    }
    return this;
  }
@Contract(pure = true)
  public @NotNull UnmodifiableHashMap<K, V> without(@NotNull K key)