Подтвердить что ты не робот

String.contains в Java

String s1 = "The quick brown fox jumps over the lazy dog";
String s2 = "";
boolean b = s1.contains(s2);
System.out.println(b);

Я запускаю Java-код выше, b возвращает true. Поскольку s2 пуст, почему s1 содержит s2?

Я проверяю API Java, пишу:

Возвращает true тогда и только тогда, когда эта строка содержит указанную последовательность значений char.

Параметры:

s - последовательность поиска

Возврат:

true, если эта строка содержит s, false иначе

4b9b3361

Ответ 1

Пустое является подмножеством любой строки.

Подумайте о них как о том, что находится между каждыми двумя символами.

Вид способа бесконечного количества точек на любой размерной линии...

(Хм... Интересно, что я получу, если бы я использовал исчисление для конкатенации бесконечного числа пустых строк)

Обратите внимание, что ".equals(" ") только.

Ответ 2

Аналогично:

"".contains("");     // Returns true.

Следовательно, кажется, что пустая строка содержится в любом String.

Ответ 3

никакое реальное объяснение не дано Java (в JavaDoc или во многих желанных комментариях кодов), но, глядя на код, кажется, что это волшебство:

вызывающий стек:

String.indexOf(char[], int, int, char[], int, int, int) line: 1591  
String.indexOf(String, int) line: 1564  
String.indexOf(String) line: 1546   
String.contains(CharSequence) line: 1934    

код:

/**
 * Code shared by String and StringBuffer to do searches. The
 * source is the character array being searched, and the target
 * is the string being searched for.
 *
 * @param   source       the characters being searched.
 * @param   sourceOffset offset of the source string.
 * @param   sourceCount  count of the source string.
 * @param   target       the characters being searched for.
 * @param   targetOffset offset of the target string.
 * @param   targetCount  count of the target string.
 * @param   fromIndex    the index to begin searching from.
 */
static int indexOf(char[] source, int sourceOffset, int sourceCount,
                   char[] target, int targetOffset, int targetCount,
                   int fromIndex) {
  if (fromIndex >= sourceCount) {
        return (targetCount == 0 ? sourceCount : -1);
  }
      if (fromIndex < 0) {
        fromIndex = 0;
      }
  if (targetCount == 0) {//my comment: this is where it returns, the size of the 
    return fromIndex;    // incoming string is 0,  which is passed in as targetCount
  }                      // fromIndex is 0 as well, as the search starts from the 
                         // start of the source string
    ...//the rest of the method 

Ответ 4

Я отвечу на ваш вопрос, используя математическую аналогию:

В этом случае число 0 не будет представлять значения. Если вы выбираете случайное число, скажем, 15, сколько раз можно вычесть 0 из 15? Бесконечные времена, потому что 0 не имеет значения, поэтому вы ничего не берете из 15. У вас есть трудности с принятием этого 15 - 0 = 15 вместо ОШИБКИ? Поэтому, если мы переключим эту аналогию на Java-кодирование, строка "не представляет значения. Выберите случайную строку, скажем" привет мир ", сколько раз можно" вычесть "из" мира привет"?

Ответ 5

Очевидным ответом на это является "то, что говорит JLS".

Размышляя о том, почему это так, подумайте, что это поведение может быть полезно в некоторых случаях. Скажем, вы хотите проверить строку на множество других строк, но количество других строк может меняться.

Итак, у вас есть что-то вроде этого:

for(String s : myStrings) {
   check(aString.contains(s));
}

где некоторые s являются пустыми строками.

Если пустая строка интерпретируется как "без ввода", и если ваша цель здесь гарантирует, что aString содержит все "входы" в myStrings, то вводит в заблуждение пустую строку для возврата false, Все строки содержат это, потому что это ничего. Сказать, что они не содержали это, означало бы, что пустая строка имела какое-то вещество, которое не было записано в строке, что является ложным.

Ответ 6

Думая о строке как наборе символов, в математике пустое множество всегда является подмножеством любого множества.