2009-06-26 3 views
26
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?String.contains in Java

я проверить API Java, это написать:

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

Параметры:

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

Returns:

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

+0

некоторые методы о пустой строке: System.out.println ("123" .contains ("")); // true System.out.println ("123" .startsWith ("")); // true System.out.println ("123" .endsWith ("")); // true System.out.println ("123" .indexOf ("")); // 0 System.out.println ("123" .lastIndexOf ("")); // 3 – 2009-06-26 07:03:58

+0

Некоторые методы о пустой строке:

 System.out.println("123".contains("")); // true System.out.println("123".startsWith("")); // true System.out.println("123".endsWith("")); // true System.out.println("123".indexOf("")); // 0 System.out.println("123".lastIndexOf("")); // 3 
2009-06-26 07:05:42

ответ

45

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

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

Вид пути есть бесконечное число точек на любом размере строки ...

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

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

+1

Не очень бесконечно - возможно, количество символов + 1, так как перед каждым символом есть пустая строка, а другая в конце. – belugabob

+12

Вы не думаете, что может быть «между» и буквой? :) –

+0

Снова прочитайте свой ответ и поняли, что «линия», о которой вы говорили, была линией, нарисованной на листе бумаги. На самом деле между ними может быть мета "" ;-) – belugabob

11

Аналогично:

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

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

4

никакого реального объяснения не даются 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 
1

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

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

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

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

где некоторые s «s пустые строки.

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

2

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

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

0

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

Смежные вопросы