code: public synchronized boolean put(final K key, final V value) {
  		if (readOnly) {
  			return false;
  		}
  		if (!validState) {
  			throw new InvalidStateException();
  		}
  		if (key == null) {
  			return false;
  		}
  		if (value == null) {
  			return false;
  		}
  		try {
  			submitRedoPut(key, value);
  			Node<K, V> splitedNode;
  			try {
  				splitedNode = putIterative(key, value); // putRecursive(key, value, rootIdx);
  			} catch (DuplicateKeyException e) {
  				return false;
  			}
  			if (splitedNode != null) {   // root was split, make new root
  				InternalNode<K, V> nodeRootNew = createInternalNode();
  				nodeRootNew.allocId();
  				if (log.isDebugEnabled()) {
  					log.debug("INCREASES TREE HEIGHT (ROOT): elements=" + elements + " oldRoot=" + rootIdx
  							+ " newRoot=" + nodeRootNew.id);
  				}
  				final K newkey = splitedNode.splitShiftKeysLeft();
  				putNode(splitedNode);
  				nodeRootNew.childs[0] = rootIdx;
  				nodeRootNew.keys[0] = newkey;
  				nodeRootNew.childs[1] = splitedNode.id;
  				nodeRootNew.allocated++;
  				rootIdx = nodeRootNew.id;
  				putNode(nodeRootNew);
  				height++; // tree height
  			}
  			elements++;
  			return true;
  		} finally {
  			stackNodes.clear();
  			stackSlots.clear();
  			releaseNodes();
  		}
  	}
docs: Put the value in the tree (if key already exists, update value)
  
  @param key
  @param value
  @return true if operation is ok, else false