docs: public void update(final T item) {
      if (itemsSeen_ == MAX_ITEMS_SEEN) {
        throw new SketchesStateException("Sketch has exceeded capacity for total items seen: "
                + MAX_ITEMS_SEEN);
      }
      if (item == null) {
        return;
      }
  
      if (itemsSeen_ < reservoirSize_) { // initial phase, take the first reservoirSize_ items
        if (itemsSeen_ >= currItemsAlloc_) {
          growReservoir();
        }
        assert itemsSeen_ < currItemsAlloc_;
        // we'll randomize replacement positions, so in-order should be valid for now
        data_.add(item);
        ++itemsSeen_;
      } else { // code for steady state where we sample randomly
        ++itemsSeen_;
        // prob(keep_item) < k / n = reservoirSize_ / itemsSeen_
        // so multiply to get: keep if rand * itemsSeen_ < reservoirSize_
        if ((SamplingUtil.rand.nextDouble() * itemsSeen_) < reservoirSize_) {
          final int newSlot = SamplingUtil.rand.nextInt(reservoirSize_);
          data_.set(newSlot, item);
        }
      }
    }