code: protected V search(final K iKey) {
      tree.pageItemFound = false;
      int size = getSize();
      if (size == 0)
        return null;
  
      // CHECK THE LOWER LIMIT
      if (tree.comparator != null)
        tree.pageItemComparator = tree.comparator.compare(iKey, getKeyAt(0));
      else
        tree.pageItemComparator = ((Comparable<? super K>) iKey).compareTo(getKeyAt(0));
  
      if (tree.pageItemComparator == 0) {
        // FOUND: SET THE INDEX AND RETURN THE NODE
        tree.pageItemFound = true;
        tree.pageIndex = 0;
        return getValueAt(tree.pageIndex);
  
      } else if (tree.pageItemComparator < 0) {
        // KEY OUT OF FIRST ITEM: AVOID SEARCH AND RETURN THE FIRST POSITION
        tree.pageIndex = 0;
        return null;
  
      } else {
        // CHECK THE UPPER LIMIT
        if (tree.comparator != null)
          tree.pageItemComparator = tree.comparator.compare((K) iKey, getKeyAt(size - 1));
        else
          tree.pageItemComparator = ((Comparable<? super K>) iKey).compareTo(getKeyAt(size - 1));
  
        if (tree.pageItemComparator > 0) {
          // KEY OUT OF LAST ITEM: AVOID SEARCH AND RETURN THE LAST POSITION
          tree.pageIndex = size;
          return null;
        }
      }
  
      if (size < BINARY_SEARCH_THRESHOLD)
        return linearSearch(iKey);
      else
        return binarySearch(iKey);
    }
docs: Execute a binary search between the keys of the node. The keys are always kept ordered. It update the pageIndex attribute with
  the most closer key found (useful for the next inserting).
  
  @param iKey
  Key to find
  @return The value found if any, otherwise null