Почему цикл for делает 2-3 прохода, если инкримент i++?
Потому что вы вводите по два-три символа. Нажатие клавиши ввода посылает в консоль управляющую последовательность возврата каретки и перевода строки, вот и получается у вас 1\r\n.
Объясняю как это работает, ну как я предполагаю по крайней мере.
Во первых System.in.read читает 1 байт из буфера ввода, во вторых System.in.read блокирует поток пока не появится  новый ввод.
Так вот когда вводим 1 и нажимаем ентер, по идее в поток ввода попадают 3 символа 1 - это что мы ввели \r -возврат каретки \n - новая строка, и сначала он считывает 1 байт который занимает символ 1, заходит в цикл выполняет тело, далее он считывает символ возврата каретки и выполняет тело и потом он считывает символ новой строки и выполняет тело, и далее поток опять блокируется в ожидании ввода.
НО! Вот с символом "й" и любой русском буквой не все так однозначно, если стоит кодировка utf8 то в ней он помоему занимает 2 байта, и поэтому должно быть 4 прохода, тоесть сначала он считает первый байт символа й, потом второй байт символа й потом возврат каретки, а потом новую строку. Ну возможно у вас используется например Windows1251 которая поддерживает русские буквы и они занимают там как раз 1 байт и поэтому только 3 прохода вместо 4х