Ответ 1
На самом деле нет хорошего ответа. Итератор в Java специально применяется к коллекции отдельных элементов (объектов). Вы могли бы подумать, что String
, который реализует CharSequence
, должен быть "коллекцией" дискретных символов. Вместо этого он рассматривается как единый объект, состоящий из символов.
В Java кажется, что итераторы применяются только к коллекциям, а не к строке. Нет причин, по которым это так (рядом, как я могу сказать - вам, вероятно, придется поговорить с Гослином или авторами API); это, по-видимому, соглашение или дизайнерское решение. Действительно, нет ничего, что помешало бы CharSequence
реализовать Iterable
.
Тем не менее, вы можете перебирать символы в строке следующим образом:
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
Или:
for(char c : str.toCharArray()) {
System.out.println(c);
}
Или:
"Java 8".chars().forEach(System.out::println);
Также обратите внимание, что вы не можете изменить символ строки на месте, потому что строки неизменяемы. Перемещаемым компаньоном для String является StringBuilder (или более старый StringBuffer).
ИЗМЕНИТЬ
Прояснить, основываясь на комментариях к этому ответу. Я пытаюсь объяснить возможное обоснование того, почему Iterator не существует на String
. Я не пытаюсь сказать, что это невозможно; действительно, для CharSequence
имеет смысл реализовать Iterable
.
String
предоставляет CharSequence
, который, если только концептуально, отличается от a String
. A String
обычно рассматривается как единый объект, тогда как CharSequence
- это именно то, что: последовательность символов. Было бы целесообразно иметь итератор на последовательности символов (т.е. На CharSequence
), но не просто на самой String
.
Как замечает Foxfire в комментариях, String
реализует интерфейс CharSequence
, поэтому по типу, a String
является CharSequence
. Семантически, мне кажется, что это две разные вещи: я, вероятно, педантичен здесь, но когда я думаю о String
, я обычно думаю об этом как о единственном сущности, которая состоит из символов. Рассмотрим разницу между порядком цифр 1, 2, 3, 4
и числом 1234
. Теперь рассмотрим разницу между строкой abcd
и последовательностью символов a, b, c, d
. Я пытаюсь указать на эту разницу.
По-моему, спрашивая, почему String
не имеет итератора, он спрашивает, почему Integer
не имеет итератора, чтобы вы могли перебирать отдельные цифры.