hasRemaining (never use size() for isEmpty)