code: protected List<String> tokenize(final char[] srcChars, final int offset, final int count) {
          if (srcChars == null || count == 0) {
              return Collections.emptyList();
          }
          final StrBuilder buf = new StrBuilder();
          final List<String> tokenList = new ArrayList<>();
          int pos = offset;
  
          // loop around the entire buffer
          while (pos >= 0 && pos < count) {
              // find next token
              pos = readNextToken(srcChars, pos, count, buf, tokenList);
  
              // handle case where end of string is a delimiter
              if (pos >= count) {
                  addToken(tokenList, StringUtils.EMPTY);
              }
          }
          return tokenList;
      }
docs: Internal method to performs the tokenization.
  <p>
  Most users of this class do not need to call this method. This method
  will be called automatically by other (public) methods when required.
  <p>
  This method exists to allow subclasses to add code before or after the
  tokenization. For example, a subclass could alter the character array,
  offset or count to be parsed, or call the tokenizer multiple times on
  multiple strings. It is also be possible to filter the results.
  <p>
  <code>StrTokenizer</code> will always pass a zero offset and a count
  equal to the length of the array to this method, however a subclass
  may pass other values, or even an entirely different array.
  
  @param srcChars  the character array being tokenized, may be null
  @param offset  the start position within the character array, must be valid
  @param count  the number of characters to tokenize, must be valid
  @return the modifiable list of String tokens, unmodifiable if null array or zero count