Вопрос

Итак, я купил книгу "Java для чайников" 4-е издание, и я должен сказать, что это, вероятно, лучшие 30 долларов, которые я когда-либо тратил на книгу.Я не новичок в программировании, на самом деле у меня это неплохо получается, если я сам так говорю.

Однако я наткнулся на строку кода, которая немного сбила меня с толку:

public void setName(String n)
{
     if(!n.equals(""))
     {
          name = n;
     }
}

Мой вопрос возникает в третьей строке, части if(!n.равно(""))...Я знаю, как работают циклы if (т.е.:if(this == that){do stuff}), но я раньше не видел настройки !n.equals("").Кто-нибудь может, пожалуйста, объяснить мне это?

PS:Просто чтобы высказать предположение.Это то же самое , что:

public void setName(String n)
{
     if(n != "")
     {
          name = n
     }
}

Я думаю, что это просто способ убедиться, что если пользователь не вводит имя (т.е.MyAccount.setName = "";) он не выдает ошибку и работает как обычно, но я не был уверен.

Заранее спасибо за помощь!

Редактировать:изменил мое "myAccount.name = """;" на "MyAccount.setName = " "";", извините за путаницу.

Спасибо:Обращается к Асафу, ценю ответ!То же самое Лукасу Трубкозубу, он тоже ответил, но сначала Асаф ответил на мой комментарий о проверке в своем собственном ответе, спасибо всем!

Это было полезно?

Решение

if(!n.equals(""))
{
     name = n;
}

означает, что если n не является пустой строкой, присвойте ее значение name .

В Java каждый объект имеет метод equals (Object o) для проверки на равенство с другим объектом.Оператор == обычно используется для сравнения примитивов.Он также может быть использован для сравнения объектов на предмет "одинаковости".т. е.эти два объекта на самом деле являются одним и тем же экземпляром.Это удобно для неизменяемых типов, таких как Строки и все объектные оболочки для примитивных типов, таких как Integer и Long.

Другие советы

В Java строки неизменяемы, но не интернированы, поэтому if(""==n) может быть или не быть true для другой строки для которой "".equals(n) является true.

Просто чтобы запутать вас еще больше, это плохой код, он получит исключение NullPointerException если вызывается с null в качестве аргумента.Это должно быть записано как "".равно(n)

Метод equals() сравнивает содержимое двух строк.Операторы == и != сообщают вам, являются ли два строковых объекта одним и тем же объектом или нет.Две разные строки с одинаковым содержимым и, следовательно, equals() друг для друга, все еще могут быть != друг для друга.Несмотря на то, что строки не изменяемы, это помогает понять разницу, если представить, что строки изменяемы, и тогда equals() означает "в данный момент одинаковы", а == означает "всегда будут одинаковыми".

Безопасное правило заключается в том, чтобы всегда использовать equals(), если вы не уверены, что обе строки являются интернированный.Цитирование:

Отсюда следует, что для любых двух строк s и t, s.intern() == t.intern() является истинным тогда и только тогда, когда s.equals(t) является истинным.

Все литеральные строки и строковые значения константные выражения интернированы.

Подумайте об этом:

String a="";
String b="";

И a, и b являются строковыми объектами, каждый со своим собственным выделением памяти и, следовательно, уникальным адресом.a и b находятся по разным адресам.Когда вы кодируете логическое выражение

a == b

вы сравниваете адреса объектов, а не их содержимое.Чтобы сравнить содержимое, вы должны использовать метод equals() строкового объекта.

Объект имеет физическое местоположение в памяти, которое уникально для каждого объекта - никакие два разных объекта не могут иметь один и тот же адрес памяти - и его содержимое или значение.Оператор == сравнивает адреса объектов;когда вы кодируете a==b, вы спрашиваете, являются ли a и b псевдонимами для одного и того же объекта - ссылаются ли a и b на одно и то же физическое местоположение.a.equals(b) спрашивает, имеют ли два объекта, где бы они ни находились, одинаковое значение.

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

метод equals() вернет a boolean значение, которое указывает, что передаваемый объект "равен" Объекту, выполняющему вызов.Этот метод "равно" может быть переопределен в классах для создания их собственного теста.В случае String, проверка заключается в том, совпадает ли значение исходной строки со значением строкового представления передаваемого объекта.

Поскольку он возвращает логическое значение, вы можете отрицать это значение с помощью !, итак, тест заключается в том, "является ли аргумент метода не пустой строкой?" Да?затем назначьте его нашему name переменная.

== всегда будет проверять, находится ли Объект слева является то же самое, что и Объект справа, поскольку он сравнивает ссылки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top