Можно ли начать считать с нулевого символа без использования position set
Что проверяют
Формулировка размытая, и первым делом оценивают, уточните ли вы, о какой структуре речь. У String позиции нет вовсе, а у буферов NIO, итераторов и Reader есть внутренний курсор, и вопрос в том, как вернуть его в начало без явной установки. Следом часто спрашивают разницу между flip(), rewind() и clear().
Как отвечать
Разберите по типам:
StringиStringBuilder: индексация с нуля, курсора нет. Циклfor (int i = 0; i < s.length(); i++)сcharAt(i), потокs.chars()илиtoCharArray().charAtработает за O(1);ByteBufferиCharBuffer:rewind()ставит позицию в ноль и сбрасывает метку, лимит не трогает, это ровно «перечитать с начала».flip()нужен после записи: лимит становится равен текущей позиции, позиция нулю. Абсолютныйget(int index)читает по индексу и позицию не двигает, аduplicate()даёт второй буфер над теми же данными со своей позицией;CharacterIterator: уStringCharacterIteratorметодfirst()возвращает первый символ и переводит итератор в начало безsetIndex;Reader: еслиmarkSupported()возвращаетtrue(уStringReaderиBufferedReaderэто так), ставитеmark()в начале и возвращаетесь черезreset().
Если вопрос прозвучал в задаче на стек, например при проверке скобок, ответ ещё проще: идёте по строке с индекса 0 и кладёте открывающие скобки в ArrayDeque, никакая позиция не нужна. ArrayDeque предпочтительнее устаревшего Stack, который синхронизирован и наследует Vector.
Где спотыкаются
Отвечают про String, не уточнив контекст, и промахиваются, если интервьюер имел в виду буфер или поток.
Путают flip() и rewind(). Если прочитать часть буфера и вызвать flip(), лимит встанет на текущую позицию, и остаток данных станет недоступен. Для перечитывания нужен rewind().
Считают, что clear() стирает данные. Он только ставит позицию в ноль, а лимит в ёмкость буфера. Байты остаются на месте, и чтение после clear() захватит мусор за пределами записанного.