code: public void put(int key, E value) {
          int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
  
          if (i >= 0) {
              mValues[i] = value;
          } else {
              i = ~i;
  
              if (i < mSize && mValues[i] == DELETED) {
                  mKeys[i] = key;
                  mValues[i] = value;
                  return;
              }
  
              if (mGarbage && mSize >= mKeys.length) {
                  gc();
  
                  // Search again because indices may have changed.
                  i = ~ContainerHelpers.binarySearch(mKeys, mSize, key);
              }
  
              if (mSize >= mKeys.length) {
                  int n = idealIntArraySize(mSize + 1);
  
                  int[] nkeys = new int[n];
                  Object[] nvalues = new Object[n];
  
                  // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
                  System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
                  System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
  
                  mKeys = nkeys;
                  mValues = nvalues;
              }
  
              if (mSize - i != 0) {
                  // Log.e("SparseArray", "move " + (mSize - i));
                  System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
                  System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
              }
  
              mKeys[i] = key;
              mValues[i] = value;
              mSize++;
          }
      }
docs: Adds a mapping from the specified key to the specified value,
  replacing the previous mapping from the specified key if there
  was one.