in src/main/java/org/apache/commons/collections4/trie/AbstractPatriciaTrie.java [2016:2071]
public V put(final K key, final V value) {
Objects.requireNonNull(key, "key");
final int lengthInBits = lengthInBits(key);
// The only place to store a key with a length
// of zero bits is the root node
if (lengthInBits == 0) {
if (root.isEmpty()) {
incrementSize();
} else {
incrementModCount();
}
return root.setKeyValue(key, value);
}
final TrieEntry<K, V> found = getNearestEntryForKey(key, lengthInBits);
if (compareKeys(key, found.key)) {
if (found.isEmpty()) { // <- must be the root
incrementSize();
} else {
incrementModCount();
}
return found.setKeyValue(key, value);
}
final int bitIndex = bitIndex(key, found.key);
if (!KeyAnalyzer.isOutOfBoundsIndex(bitIndex)) {
if (KeyAnalyzer.isValidBitIndex(bitIndex)) { // in 99.999...9% the case
/* NEW KEY+VALUE TUPLE */
final TrieEntry<K, V> t = new TrieEntry<>(key, value, bitIndex);
addEntry(t, lengthInBits);
incrementSize();
return null;
}
if (KeyAnalyzer.isNullBitKey(bitIndex)) {
// A bits of the Key are zero. The only place to
// store such a Key is the root Node!
/* NULL BIT KEY */
if (root.isEmpty()) {
incrementSize();
} else {
incrementModCount();
}
return root.setKeyValue(key, value);
}
if (KeyAnalyzer.isEqualBitKey(bitIndex) && found != root) { // NOPMD
incrementModCount();
return found.setKeyValue(key, value);
}
}
throw new IllegalArgumentException("Failed to put: " + key + " -> " + value + ", " + bitIndex);
}