所以我已经购买了“Java for Dummies”第4版,我必须说它可能是我花在书上的最好的30美元。我不是新编码的人,如果我自己这样说,我实际上相当不错。
但是,我遇到了一行让我感到困惑的代码:
public void setName(String n)
{
if(!n.equals(""))
{
name = n;
}
}
我的问题出现在第三行,if(!n.equals(“”))部分......我知道if循环是如何工作的(即:if(this == that that){do stuff}),但我以前没见过!n.equals(“”)。有人可以向我解释一下吗?
PS:只是想猜一猜。它是否相同:public void setName(String n)
{
if(n != "")
{
name = n
}
}
我认为这只是一种方法,以确保如果用户没有输入名称(即myAccount.setName =“”;)它不会回复错误并像正常一样运行,但我不是不确定。
提前感谢您的帮助!
编辑:改变了我的“myAccount.name =”“;”到“myAccount.setName =”“;”,对此感到抱歉。
谢谢你:去Asaph,感谢答案!和Lucas Aardvark一样,他回答说,但Asaph先回答了我自己的回答中的验证评论,感谢所有人!
答案 0 :(得分:9)
在java中,字符串是不可变的但不是实体,所以 if(“”== n)对于另一个字符串可能是也可能不是 其中“.equals(n)为真。
只是为了让你更加困惑,这是错误的代码,它会得到一个NullPointerException 如果以null作为参数调用。它应该写成“”.equals(n)
答案 1 :(得分:5)
if(!n.equals(""))
{
name = n;
}
表示如果n不是空字符串,则将其值赋给name。
在Java中,每个Object都有一个equals(Object o)方法来测试与另一个Object的相等性。 ==运算符通常用于比较基元。它也可以用于比较对象的“相同性”。即。这两个对象实际上是同一个实例。这对于诸如字符串之类的不可变类型以及诸如Integer和Long之类的基本类型的所有Object包装器都很方便。
答案 2 :(得分:3)
equals()方法比较两个字符串的内容。 ==和!=运算符告诉您两个String对象是否是同一个对象。具有相同内容的两个不同的字符串,因此彼此等于(),可能仍然是彼此的=。尽管字符串不可变,但通过想象字符串是可变的来理解差异是有帮助的,然后equals()表示“当前是相同的”,==表示“将始终是相同的”。
安全规则是始终使用equals(),除非您确定两个字符串都是interned。引用:
对于任何两个字符串s 和t,s.intern()== t.intern()是 当且仅当s.equals(t)为时,才为真 真。
所有文字字符串和字符串值 常数表达式被实习。
答案 3 :(得分:1)
考虑一下:
String a="";
String b="";
a和b都是String OBJECTS,每个都有自己的内存分配,因而是唯一的地址。 a和b位于不同的地址。编写布尔表达式
时a == b
您正在比较对象的地址,而不是它们的内容。要比较一下 内容必须使用String对象的equals()方法。
对象在内存中具有物理位置,对于每个对象都是唯一的 - 没有两个不同的对象可以具有相同的内存地址 - 及其内容或值。 ==运算符比较对象的地址;当你编码a == b时,你会问a和b是否是同一个对象的别名:do a和b指的是同一个物理位置。 a.equals(b)询问这两个对象是否具有相同的值。
编译器“interning”有点复杂,编译器可能在编译时检测到两个常量具有相同的值并重用相同的对象,但对于在运行时创建的值不会这样。
答案 4 :(得分:0)
方法equals()
将返回boolean
值,该值表明传入的对象“等于”进行调用的对象。这个'等于'方法可以在类中重写以进行自己的测试。在String
的情况下,测试是原始String的值是否与传入的Object的String表示的值相同。
当它返回一个布尔值时,你可以用!
否定该值,所以测试'是方法参数不是空字符串吗?'是?然后将其分配给我们的name
变量。
==
将始终测试左侧上的Object是否与右侧的Object相同,因为它会比较引用。