public V remove(Object key) {
		checkSizeRemove();
		int index = getIndex(key);
		int plus = 1;
		do {
			WeakReference<K> k = keys[index];
			if (k == null) {
				// found an empty record
				return null;
			} else if (k == DELETED_KEY) {
				// continue
			} else {
				Object r = k.get();
				if (r == null) {
					delete(index);
				} else if (r == key) {
					// found the record
					V old = values[index];
					delete(index);
					return old;
				}
			}
			index = (index + plus++) & mask;
			k = keys[index];
		} while (plus <= len);
		// not found
		return null;
	}