Строка Java-кода и что он делает? - PullRequest
7 голосов
/ 01 октября 2009

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: изменил мой "myAccount.name =" ";" to "myAccount.setName =" ";", извините за путаницу.

СПАСИБО: Идете в Асаф, цените ответ! То же самое относится и к Лукасу Аардварку, ответил он, но Асаф сначала ответил на мой проверочный комментарий в своем собственном ответе, спасибо всем!

Ответы [ 5 ]

9 голосов
/ 01 октября 2009

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

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

5 голосов
/ 01 октября 2009
if(!n.equals(""))
{
     name = n;
}

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

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

3 голосов
/ 01 октября 2009

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

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

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

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

1 голос
/ 01 октября 2009

Учтите это:

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

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

a == b

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

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

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

0 голосов
/ 01 октября 2009

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

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

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

...