Простая, если постановка задачи
Я пытаюсь вернуть toString, если что-то верно.
У меня есть этот код:
public void printoutsailings() {
for (Sailing s:sailings) {
String hamburg = ("Hamburg");
if ((s.getDeparturePort()) == hamburg) {
System.out.println(s.toStringAdjusted());
}
}
}
Однако я ничего не получаю, когда запускаю метод (когда должен что-то получать). Я предполагаю, что я каким-то образом испортил логику или не понял =,== и eq правильно, я не слишком уверен.
В toString или цикле for нет ничего плохого, и я не получаю никаких ошибок компилятора или времени выполнения. Просто логика неверна.
Если бы кто-то мог исправить меня, это было бы оценено. Благодарю.
10 ответов
Вы должны использовать .equals()
вместо ==
Проверять String
равенство. Попробуйте следующее:
if ((s.getDeparturePort()).equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
Короче, ==
проверяет, являются ли две строки одной и той же ссылкой, и .equals()
проверяет, выглядят ли две строки одинаково
Следует также сказать, что вам нужно использовать .equals()
для проверки равенства любого Object
типа, а не только строки. Только примитивные типы (int
, double
, char
) следует использовать ==
для равенства.
Чтобы компенсировать тот факт, что вылет может быть нулевым, просто измените условие. Было бы читать - hamburg.equals(s.getDeparturePort())
Да, вы полагаетесь на == сравнение на равенство, а не идентичность. Измените код на:
if (s.getDeparturePort().equals("hamburg")) {
System.out.println(s.toStringAdjusted());
}
Для ссылочных типов == в Java всегда означает "сравнить две ссылки на равенство". Другими словами, он возвращает, ссылаются ли две ссылки на один и тот же объект.
Вы хотите проверить, равны ли две строки, а именно - содержат ли они одинаковую последовательность символов. Вот что переопределено equals
метод для.
(Чтобы продемонстрировать это на практике, каждое утро я сажусь на автобус № 36. Для меня эти автобусы равны, потому что они едут по тому же маршруту, но я знаю, что есть несколько автобусов № 36 - я не получаю на том же физическом автобусе каждый день.)
Обратите внимание, что приведенный выше код NullPointerException
если s.getDeparturePort()
возвращается null
, Есть два способа избежать этого. Во-первых, вы можете использовать ссылку, известную как не равную нулю, в качестве цели вызова метода:
if ("hamburg".equals(s.getDeparturePort()))
Кроме того, вы можете выполнить явную проверку недействительности:
String port = s.getDeparturePort();
if (port != null && port.equals("hamburg"))
Или вы можете оставить это, чтобы вызвать исключение, если это наиболее подходящее поведение (т.е. если вы действительно не ожидаете getDeparturePort()
вернуть ноль, и хотите взорвать, если вы получаете такие плохие данные, а не продолжать и, возможно, распространения проблемы).
В String равенство проверяется либо equals()
метод или compareTo()
метод.
Ваше решение может быть исправлено:
if (s.getDeparturePort().equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
Чтобы избежать получения null
от s.getDeparturePort()
Я бы сделал следующее.
if ("Hamburg".equals(s.getDeparturePort())) {
System.out.println(s.toStringAdjusted());
}
Это чтобы избежать NullPointerException
если s.getDeparturePort()
является null
(из вашего примера кода).
Кроме того, вы можете использовать compareTo()
метод вроде так....
Ваш измененный код (для использования compareTo()
:
if (s.getDeparturePort().compareTo(hamburg) == 0) {
System.out.println(s.toStringAdjusted());
}
Мое альтернативное решение (используя compareTo()
)
if ("Hamburg".compareTo(s.getDeparturePort()) == 0) { //Zero means that it is equal.
System.out.println(s.toStringAdjusted());
}
Btw...
String hamburg = ("Hamburg");
может быть легко написано как
String hamburg = "Hamburg";
Вы должны сравнить строки, используя equals
метод.
В Java String
является ссылочным типом Это означает, что ваш String hamburg
, указывающая на переменную в стеке, содержит ссылку на управляемый объект кучи, фактически содержащий строку. Напротив, тип значения полностью выделяется в стеке.
==
, чтение ссылки равно сравнивает значения стека. Вместо этого все классы реализуют equals
метод сравнения значений Он сравнивает реальные значения объекта, где бы они ни находились.
Следующий код работает для вас:
public void printoutsailings() {
for (Sailing s:sailings) {
String hamburg = ("Hamburg");
if (hamburg.equals(s.getDeparturePort())) { //First hamburg to prevent any possible NullPointerException
System.out.println(s.toStringAdjusted());
}
}
}
Просто для вашего любопытства:
- PHP сравнивает только по значению
- C# переопределяет
==
оператор как значение равно оператору, но только дляstring
учебный класс - В VB.NET по умолчанию
=
оператор - это значение равно оператору.Is
Оператор соответствует ссылочной равно
==
сравнивает сам объект, вам лучше использовать .equals()
так как он будет сравнивать фактическое значение строки, например:
if ((s.equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
Также убедитесь, что Sailings
имеет по крайней мере 1 значение, иначе вы никогда не введете его в цикл
Пытаться
public void printoutsailings() {
for (Sailing s:sailings) {
String hamburg = "Hamburg";
if (s.getDeparturePort().equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
}
}
Вместо того, чтобы просто предоставить код... проверьте это, я почти уверен, что он доставит вас туда, куда вам нужно идти...
Вместо использования == для объектов String (или любых объектов), используйте.compareTo(), как в этом примере:
http://leepoint.net/notes-java/data/strings/12stringcomparison.html