Как узнать, существует ли подстрока внутри другой строки в Java 1.4?

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

13
задан Braiam 3 March 2017 в 15:25
поделиться

3 ответа

Используйте регулярное выражение и отметьте его как нечувствительное к регистру:

if (myStr.matches("(?i).*template.*")) {
  // whatever
}

(? i) включает нечувствительность к регистру, и.* в каждом конце критерия поиска соответствуют любым окружающим символам (так как String.matches работает над всей строкой).

14
ответ дан 1 December 2019 в 17:37
поделиться

String.indexOf (Строка)

Для поиска без учета регистра, к toUpperCase или toLowerCase и на исходной строке и на подстроке перед indexOf

String full = "my template string";
String sub = "Template";
boolean fullContainsSub = full.toUpperCase().indexOf(sub.toUpperCase()) != -1;
31
ответ дан 1 December 2019 в 17:37
поделиться

Можно использовать indexOf () и toLowerCase (), чтобы сделать нечувствительные к регистру тесты для подстрок.

String string = "testword";
boolean containsTemplate = (string.toLowerCase().indexOf("template") >= 0);
3
ответ дан 1 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: