我的代码中有一些奇怪的错误。我有变量类型,当我从类Settings(实现持久性)加载它时它有值“CPU 21”(类型=“CPU 21”),但当我尝试 if(type ==“CPU 21”)条件为false。怎么可能?
答案 0 :(得分:5)
这根本不是一个错误。这是==的工作方式。
对于引用类型(例如字符串),“==”将始终直接比较引用。如果您有两个引用引用具有相同内容的单独对象,则“==”将评估为false。使用equals
进行值相等。
请注意,使用字符串文字很容易欺骗自己:
String x = "CPU 21";
String y = "CPU 21";
boolean b = (x == y);
现在b
为真,因为x
和y
的值 - 引用实际上是相同的。它们引用了相同的String对象。与此相比:
String x = new String("CPU 21");
String y = new String("CPU 21");
boolean b1 = (x == y);
boolean b2 = x.equals(y);
现在b1
为false,因为x
和y
引用了不同的String
个对象,但b2
为真,因为String.equals(String)
比较了内容有问题的字符串(即字符串表示的字符序列)。
答案 1 :(得分:4)
您必须使用.equals()
来比较字符串内容:
if (type.equals("CPU 21")) ...
这是因为==
运算符仅比较两个引用以查看它们是否指向同一个对象。由于您的字符串type
与文字"CPU 21"
不是同一个对象,因此比较结果为false。 .equals()
方法实际上会检查字符串本身。
您可能还会发现人们经常以相反的方式写这个:
if ("CPU 21".equals(type)) ...
这意味着同样的事情,但如果type
恰好是null
,则不会抛出异常。
答案 2 :(得分:3)
您需要使用equals();
来比较字符串值
替换
if(type=="CPU 21")
与
if("CPU 21".equals(type))
==将比较两个参考变量。而equals将检查对象的相等性 另见
答案 3 :(得分:3)
equals()和==之间有什么区别?
说明:1
他们的意义非常不同。 equals()方法存在于java.lang.Object类中,期望检查对象状态的等价性!这意味着,对象的内容。期望'=='运算符检查实际对象实例是否相同。
例如,假设您有两个String对象,它们由两个不同的引用变量s1和s2指向。
s1 = new String("abc");
s2 = new String("abc");
现在,如果您使用“equals()”方法检查它们的等效性为
if(s1.equals(s2))
System.out.println("s1.equals(s2) is TRUE");
else
System.out.println("s1.equals(s2) is FALSE");
您将输出为TRUE,因为'equals()'方法检查内容是否相等。
让我们检查'=='运算符..
if(s1==s2)
System.out.printlln("s1==s2 is TRUE");
else
System.out.println("s1==s2 is FALSE");
现在你将获得FALSE 作为输出,因为s1和s2都指向两个不同的对象,即使它们都共享相同的字符串内容。这是因为每次创建新对象时都会出现'new String()'。
尝试运行没有'new String'的程序,只需运行
String s1 = "abc";
String s2 = "abc";
两个测试都会得到TRUE。
说明:2
通过定义,对象都在堆上创建。当你创建一个对象时,比如说,
Object ob1 = new SomeObject();
Object ob2 = new SomeObject();
我们有2个具有完全相同内容的对象,让我们假设。我们还有2个引用,假设ob1在地址0x1234,ob2在地址0x2345。虽然对象的内容相同,但引用不同。
使用==比较引用。尽管对象ob1和ob2在内部是相同的,但它们在使用此操作时有所不同,因为我们共同参考。将地址0x1234处的ob1与地址0x2345处的ob2进行比较。因此,这种比较会失败。
另一方面,object.equals()比较值。因此,ob1和ob2之间的比较将会通过。请注意,应明确覆盖equals方法以使此比较成功。