code: public synchronized Object remove(int id)
     throws IllegalArgumentException
     {
  		if (tc.isEntryEnabled()) SibTr.entry(this, tc, "remove", ""+id);
        
        Object returnValue = get(id);
        if (returnValue != null) table[id] = null;
              
        if (id < lowestPossibleFree) lowestPossibleFree = id;
        
        // If the ID removed was at just below the high water mark, then
        // move the high water mark down as far as we can.
        if ((id+1) == highWaterMark)
        {
           int index = id;
           while(index >= lowestPossibleFree)
           {
              if (table[index] == null) highWaterMark = index;
              --index; 
           }
        } 
        
  		if (tc.isEntryEnabled()) SibTr.exit(this, tc, "remove", returnValue);
        return returnValue;
     }
docs: Removes an object from the table.
  @param id The ID of the object to remove.  It is valid to specify
  an ID which does not map to an object, this is effectivly a no-op.
  @return Object The object which was removed or null if the ID did
  not map to an object.
  @throws IllegalArgumentException Thrown if the id specified is less than
  one or larger than the maximum size specified when the table was
  created.