2015-07-12 4 views
3

Несколько месяцев назад я помню, что был в интервью и попросил три разных способа сравнить строки в Java для своих значений. Из любопытства я собираюсь попросить его здесь для моей справки. Я подумал о двух:Три разных способа сравнения строк в Java

  1. str1.equals(str2) или с помощью compareTo, как подсчет как один в общей
  2. сравнения посимвольно

Любая идея? «==», equalsTo, compareTo, и любые их варианты не так мне сказали.

Редактировать: Исправлен вопрос.

+0

Ответ «это зависит». Что вы пытаетесь проверить в сравнении? если вы хотите проверить, что обе строки имеют одинаковое значение «toString()», вы действительно должны использовать 'equals'. Если вы хотите проверить, является ли это тот же самый объект (вы почти * никогда не хотите этого делать), вы должны использовать '=='. – alfasin

+0

Вы также можете использовать функцию compare(), создать свой собственный класс или ==: проверить [Как сравнить строки в Java] (https://stackoverflow.com/questions/513832/how-do-i- compare-strings-in-java) – JGreenwell

+0

Проверить, имеют ли они оба одинаковое значение. Но три разных способа сделать это. – HikeTakerByRequest

ответ

4

Поскольку было такое огромное возражение против использования == я не мог удержаться от соблазна размещения ответа, что делает использовать его (и который вполне допустимо!) :)))

String s1 = new String("abc"); // create string object 1 
    String s2 = new String("abc"); // create a different string object 2 
    s1 = s1.intern(); 
    s2 = s2.intern(); 
    System.out.println(s1 == s2); // true! 

Так что, если мы уверены, интернировать строки мы может кол-во на ==.

Кроме того, как я предложил в вышеприведенных комментариев: это звучит как интервьюер ищет решение «wiseass», например:

s1.contains(s2) && s2.contains(s1)

или

s1.matches(s2) && s2.matches(s1)

или

s1.replace(s2, "").isEmpty() && s2.replace(s1, "").isEmpty()

и т. Д.

+0

Возможно, это было одно. Будет ли это всегда работать, тогда как 'str1 == str2' без стажера не будет? – HikeTakerByRequest

+0

Возможно, вы правы. Если это так, компания заслуживает нанимать кого-то, кто обладает высокой квалификацией в неясных трюках и бесполезных знаниях, но не может написать практическую программу, стоящую^# &^# @. – ajb

+0

@Manbearpig действительно. без стажера он может работать и не может: если одна из строк была создана с использованием ключевого слова 'new', она не будет работать без стажера. – alfasin

0

Есть четыре способа:
==
.equals()
compareTo()
compare()

прочитанной more

+0

== и compareTo не считаются дополнительными, о чем мне говорили. – HikeTakerByRequest

+0

Он попросил «сравнить строки», а не ссылку. Так что == просто неправильно, потому что он сравнивает ссылку. – fubbe

+0

Я не думаю, что '==' считается вообще. Если я интервьюер, а кандидат предлагает «==» как способ сравнить «String's», интервью закончилось. (ОК, это преувеличение, но это определенно показывает отсутствие базовых знаний Java.) – ajb

1

Я угадывание

1) с использованием '==' оператор», который сравнить строки ссылки

2) равна() метод String, которые сравнивают точное содержание строки

) Метод 3 equalsIgnoreCase() которые сравнивают содержимое строки в случае, если incensitive образом

+0

2 и 3 оба одинаковы и не используют == –

0

Некоторые другие варианты могут быть (look here for details) -

1. Сравнение Строка с использованием метода equals
2. Сравнение строк с использованием метода equalsIgnoreCase
3. Сравнение строк с использованием compareTo метод
4. Сравнение строк с использованием метода compareToIgnoreCase

1

Если я устранить те, которые учитывают корпуса, есть еще много способов, и я уверен, что я м отсутствуют некоторые:

s1.equals(s2) 
s1.compareTo(s2) 
s1.contentEquals(s2) 
Objects.equals(s1, s2) 
Objects.deepEquals(s1, s2) 

EDIT

Технически это также способ, но я думаю, что это плохая практика:

s1.intern() == s2.intern() 
2

Я могу придумать несколько способов, кроме глядя на каждого персонажа самостоятельно или с помощью equals() или compareTo():

s1.startsWith(s2) && s2.startsWith(s1) 
s1.contains(s2) && s2.contains(s1) 
s1.indexOf(s2) == 0 && s2.indexOf(s1) == 0 
Arrays.equals(s1.toCharArray(), s2.toCharArray()) 
s1.intern() == s2.intern() 

Чтобы быть откровенным, хотя , На самом деле я не вижу значения этого в качестве вопроса интервью.(Если у интервьюера был последний вопрос, лучшим моментом, на мой взгляд, было бы определение всех случаев, когда было бы безопасно использовать == для сравнения значений строк.)

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