public V put(K key, V value) {
		checkSizePut();
		int index = getIndex(key);
		int plus = 1;
		int deleted = -1;
		do {
			WeakReference<K> k = keys[index];
			if (k == null) {
				// found an empty record
				if (deleted >= 0) {
					index = deleted;
					deletedCount--;
				}
				size++;
				keys[index] = new WeakReference<K>(key);
				values[index] = value;
				return null;
			} else if (k == DELETED_KEY) {
				if (deleted < 0) {
					// found the first deleted record
					deleted = index;
				}
			} else {
				Object r = k.get();
				if (r == null) {
					delete(index);
				} else if (r == key) {
					// update existing
					V old = values[index];
					values[index] = value;
					return old;
				}
			}
			index = (index + plus++) & mask;
		} while (plus <= len);
		throw new IciqlException("Hashmap is full");
	}