Java String.indexOf и пустые строки
Мне любопытно, почему String.indexOf
возвращает 0 (вместо -1) при запросе индекса пустой строки внутри строки.
Javadocs говорит только, что этот метод возвращает индекс в этой строке указанной строки, -1, если строка не найдена.
Мне это поведение кажется неожиданным, я бы ожидал -1. Есть идеи, почему такое неожиданное поведение происходит? Я бы по крайней мере подумал, что это стоит отметить в методе Javadocs...
System.out.println("FOO".indexOf("")); // outputs 0 wtf!!!
System.out.println("FOO".indexOf("bar")); // outputs -1 as expected
System.out.println("FOO".indexOf("F")); // outputs 0 as expected
System.out.println("".indexOf("")); // outputs 0 as expected, I think
Ответы
Ответ 1
Пустая строка везде, и нигде. Он всегда находится во всех строках, пронизывая сущность своего существа, но когда вы его ищете, вы никогда не поймете проблеска.
Сколько пустых строк вы можете поместить в начале строки? Mu
Студент сказал учителю,
Учитель, я считаю, что я нашел природу пустой строки. Пустая строка похожа на частицу пыли, и она свободно плавает через нитку, поскольку пыль свободно плавает по комнате, сверкая лучами солнечного света.
Учитель ответил ученику,
Хм. Прекрасное понятие. Скажи мне, где пыль, и где солнечный свет?
Учитель ударил ученика ремнем и поручил ему продолжить медитацию.
Ответ 2
Хорошо, если это поможет, вы можете думать о "FOO"
как "" + "FOO"
.
Ответ 3
int number_of_empty_strings_in_string_named_text = text.length() + 1
Все символы разделяются пустым String
. Кроме того, пустой String
присутствует в начале и в конце.
Ответ 4
Используя выражение "", вы на самом деле ссылаетесь на пустую строку. Нуль-строка - это эфирный тег, помещенный на нечто, что существует только для того, чтобы показать, что в этом месте отсутствует что-то.
Итак, говоря ".indexOf(" "), вы действительно спрашиваете переводчика:
Где строковое значение null существует в моей пустой строке?
Он возвращает ноль, так как нуль находится в начале несуществующей нулевой строки.
Чтобы добавить что-нибудь в строку, теперь сделайте ненулевую строку... null можно рассматривать как отсутствие всего, даже ничего.
Ответ 5
Используя алгебраический подход, "является нейтральным элементом конкатенации строк: x +" "== x и" " + x == x (хотя + здесь не коммутативен).
Тогда это также должно быть:
x.indexOf ( y ) == i and i != -1
<==> x.substring ( 0, i ) + y + x.substring ( i + y.length () ) == x
когда y = ", это выполняется, если я == 0 и x.substring(0, 0) ==" ".
Я не проектировал Java, но я думаю, в нем участвовали математики...