Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.
В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.
Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:
if (string1.equals(string2))
Этот метод String равен методу для двух строк Java, и если они содержат точно такую же строку символов, они считаются равными.
Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):
String string1 = "foo";
String string2 = "FOO";
if (string1.equals(string2))
{
// this line will not print because the
// java string equals method returns false:
System.out.println("The two strings are the same.")
}
Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:
String string1 = "foo";
String string2 = "foo";
// test for equality with the java string equals method
if (string1.equals(string2))
{
// this line WILL print
System.out.println("The two strings are the same.")
}
Вариант 2: Сравнение строк с методом equalsIgnoreCase
В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:
String string1 = "foo";
String string2 = "FOO";
// java string compare while ignoring case
if (string1.equalsIgnoreCase(string2))
{
// this line WILL print
System.out.println("Ignoring case, the two strings are the same.")
}
Вариант 3: сравнение строк Java с методом compareTo
Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:
String string1 = "foo bar";
String string2 = "foo bar";
// java string compare example
if (string1.compareTo(string2) == 0)
{
// this line WILL print
System.out.println("The two strings are the same.")
}
Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).
Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()
Вы not , так сказать, изменяете список. Вы просто изменяете элементы в списке. Я не думаю, что это проблема.
Чтобы ответить на ваш второй вопрос, оба способа действительно разрешены (как вы знаете, с тех пор, как вы запускали код), но это будет зависеть от ситуации. Является ли содержание изменчивым или неизменным?
Например, если вы хотите добавить один из каждого элемента в список целых чисел, это не сработает:
>>> x = [1, 2, 3, 4, 5]
>>> for i in x:
... i += 1
...
>>> x
[1, 2, 3, 4, 5]
Действительно, int
s являются неизменяемыми объектами. Вместо этого вам нужно будет перебирать индексы и изменять элемент в каждом индексе, например:
>>> for i in range(len(x)):
... x[i] += 1
...
>>> x
[2, 3, 4, 5, 6]
Если ваши элементы изменяемы, то первый метод (непосредственно итерации над элементами, чем индексы) является более эффективным, без сомнения, потому что дополнительный шаг индексации - это накладные расходы, которые можно избежать, поскольку эти элементы изменяемы.
Конечно, вы можете. Первый способ является нормальным, но в некоторых случаях вы также можете использовать функции list или map()
.
Я знаю, что вы не должны добавлять / удалять элементы во время итерации по списку. Но могу ли я изменить элемент в списке, который я выполняю, если я не изменяю длину списка?
blockquote>. Вы не изменяете список в любом пути в все. То, что вы изменяете , - это элементы в списке; Это прекрасно. Пока вы не меняете фактический список напрямую, вы в порядке.
Нет необходимости перебирать индексы. На самом деле это одностороннее. Если вы на самом деле пытаетесь изменить сам список, просто перебирайте список по значению.
Если да, будет ли следующий сниппл действительным?
< / blockquote>lovely_numbers = [[41, 32, 17], [26, 55]] for numbers_pair in lovely_numbers: numbers_pair.pop() print(lovely_numbers) # [[41, 32], [26]]
Абсолютно. По тем же причинам, что я сказал выше. Вы не изменяете сами
lovely_numbers
. Скорее всего, вы только изменяете элементы вlovely_numbers
.