字符串比较奇怪的bug

时间:2011-01-19 08:24:53

标签: java

我的代码中有一些奇怪的错误。我有变量类型,当我从类Settings(实现持久性)加载它时它有值“CPU 21”(类型=“CPU 21”),但当我尝试  if(type ==“CPU 21”)条件为false。怎么可能?

4 个答案:

答案 0 :(得分:5)

这根本不是一个错误。这是==的工作方式。

对于引用类型(例如字符串),“==”将始终直接比较引用。如果您有两个引用引用具有相同内容的单独对象,则“==”将评估为false。使用equals进行值相等。

请注意,使用字符串文字很容易欺骗自己:

String x = "CPU 21";
String y = "CPU 21";
boolean b = (x == y);

现在b为真,因为xy的值 - 引用实际上是相同的。它们引用了相同的String对象。与此相比:

String x = new String("CPU 21");
String y = new String("CPU 21");
boolean b1 = (x == y);
boolean b2 = x.equals(y);

现在b1为false,因为xy引用了不同的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方法以使此比较成功。