7

所以我买了《Java for Dummies》第 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 = “”;” 到 "myAccount.setName = "";",很抱歉造成混乱。

谢谢:去亚萨,感谢答案!Lucas Aardvark 也一样,他也回答了,但是 Asaph 先在他自己的回答中回答了我的验证评论,谢谢大家!

4

5 回答 5

9

在 java 中,字符串是不可变的,但不是内部的,所以 if(""==n) 对于另一个 "".equals(n) 为真的字符串可能为真,也可能不为真。

只是为了让您更加困惑,这是一个糟糕的代码,如果以 null 作为参数调用它,它将得到一个 NullPointerException。它应该写成 "".equals(n)

于 2009-10-01T03:27:02.207 回答
5
if(!n.equals(""))
{
     name = n;
}

表示如果 n 不是空字符串,则将其值分配给 name。

在 Java 中,每个 Object 都有一个 equals(Object o) 方法来测试与另一个 Object 是否相等。== 运算符通常用于比较原语。它还可用于比较对象的“相同性”。IE。这两个对象实际上是同一个实例。这对于不可变类型(例如字符串)和原始类型(例如 Integer 和 Long)的所有 Object 包装器非常有用。

于 2009-10-01T03:24:15.440 回答
3

equals() 方法比较两个字符串的内容。== 和 != 运算符告诉您两个 String 对象是否是同一个对象。两个具有相同内容的不同字符串,因此彼此相等(),可能仍然是 != 彼此。尽管字符串不是可变的,但通过想象字符串是可变的,它有助于理解差异,然后 equals() 表示“当前相同”,== 表示“将始终相同”。

安全规则是始终使用 equals() ,除非您确定两个字符串都是interned。报价:

由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。

所有文字字符串和字符串值的常量表达式都是实习的。

于 2009-10-01T05:22:38.490 回答
1

考虑一下:

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

a 和 b 都是 String OBJECTS,每个都有自己的内存分配,因此有一个唯一的地址。a 和 b 位于不同的地址。当您编写布尔表达式时

a == b

您正在比较对象的地址,而不是它们的内容。要比较内容,您必须使用 String 对象的 equals() 方法。

一个对象在内存中有一个物理位置,每个对象都是唯一的——没有两个不同的对象可以有相同的内存地址——以及它的内容或值。== 运算符比较对象的地址;当您编写 a==b 代码时,您是在询问 a 和 b 是否是同一个对象的别名—— a 和 b 是否指的是同一个物理位置。a.equals(b) 询问这两个对象是否具有相同的值,无论它们在哪里。

这在编译器“interning”中有些复杂,编译器可能会在编译时检测到两个常量具有相同的值并重用相同的对象,但对于在运行时创建的值而言,情况并非如此。

于 2009-10-01T03:26:15.313 回答
0

该方法equals()将返回一个boolean值,该值表明传入的对象“等于”进行调用的对象。可以在类中重写此“等于”方法以进行自己的测试。在 的情况下String,测试的是原始 String 的值是否与传入的 Object 的 String 表示的值相同。

当它返回一个布尔值时,您可以用 a 否定该值!,因此测试是“方法参数不是空字符串吗?” 是的?然后将其分配给我们的name变量。

==将始终测试左侧的对象是否右侧的对象相同,因为它比较引用。

于 2009-10-01T03:27:15.047 回答