0

为什么下面的“if()”语句评估为真?

operand1 = "0";
operand1 = Integer.toBinaryString(Long.valueOf(operand1, 10).intValue());


if(operand1 != "0") {
    display_secondary.setText(operand1.toUpperCase(Locale.ENGLISH));
}

上面的“if”语句被评估为 true,并且运行里面的代码。为什么会这样?


下面的代码评估为假(如预期的那样)。

operand1 = Integer.toBinaryString(Long.valueOf(operand1, 10).intValue());
operand1 = "0"; 

if(operand1 != "0") {
    display_secondary.setText(operand1.toUpperCase(Locale.ENGLISH));
}
4

3 回答 3

3

String在 Java 中进行比较,请使用:

if(!operand1.equals("0")){

}

在您执行此操作的过程中,您正在比较对象地址而不是String内容。

于 2013-09-09T02:22:34.043 回答
2

在 Java 中,Strings 是不可变的,这允许语言进行大量优化。其中之一称为interning:它将某些Strings 放入共享池中,以避免相同的副本浪费空间。

常量Strings 总是interned,因此在相同的常量s(例如)上使用==and!=运算符(检查两个变量是否是同一个确切的 object,而不是它们的对象是否“相等” )会有点工作。几乎总是首选使用。String"0"equals

您的Integer.toBinaryString调用构造了一个全新的,它恰好与赋值和条件中使用String的常量具有相同的内容,但它是一个不同的对象。Stringif

于 2013-09-09T02:34:14.233 回答
0
 String s1="hey";
 String s2="hey";
  String s3=new String("hey");
 System.out.println(s1==s2);
  System.out.println(s1==s3);

s1,s2 它们都将指向内存中的相同空间..因此 s1==s2 和 s1.equals(s2) ....两者都为真

s1,s3 将指向不同的空间...

因此 s1.equals(s3) 为真,但 s1==s3 为假

于 2013-09-09T04:29:44.313 回答