String.contains в Java - PullRequest
       6

String.contains в Java

26 голосов
/ 26 июня 2009
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?

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

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

Параметры:

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

Возвращает:

истина, если эта строка содержит s, ложь в противном случае

Ответы [ 6 ]

45 голосов
/ 26 июня 2009

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

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

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

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

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

11 голосов
/ 26 июня 2009

Аналогично:

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

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

4 голосов
/ 26 июня 2009

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 
2 голосов
/ 03 января 2015

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

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

1 голос
/ 12 июня 2013

Очевидный ответ на этот вопрос - «это то, что говорит JLS».

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

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

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

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

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

0 голосов
/ 03 февраля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...