3

当我运行一些代码(稍后显示)时,我告诉它检查字符串是否 == "1",如果是,则输出 "It's 1!",否则,输出字符串。

代码:

double shirt3 = Math.random() * 9;
String shirt2 = Double.toString(shirt3);
char shirt1 = shirt2.charAt(0);
String shirt = Character.toString(shirt1);

if(shirt == "1") {
    System.out.println("It's 1!");
} else {
    System.out.println(shirt);
}

输出:

7
4
8
1
7
1
7
7
6
0

4

6 回答 6

9

你需要使用

if (shirt.equals("1"))
    ...

这将比较 String 对象的实际内容,而不是它们的身份。

于 2012-04-08T04:53:57.880 回答
5

您犯了 Java 初学者使用==测试字符串相等性的错误。请改用该equals方法。

更长的解释是,==Java 中的运算符测试两个对象引用是否相同;即它测试左右操作数是否是同一个对象。但是您拥有的是两个不同的字符串,它们包含相同的字符序列。它们是“相等”的字符串,但不是同一个对象。

作为一般经验法则,您应该始终使用equals来比较字符串。

(在某些情况下==可行,但您确实需要了解自己在做什么才能确定。而且在绝大多数用例中,这根本不值得付出努力/冒险。)

于 2012-04-08T04:54:03.547 回答
4

要检查 Java 中的两个字符串是否相同,请使用.equals()

"1" == new String("1") //returns false
"1".equals(new String("1")) //returns true

编辑:添加了 new String("1") 以确保我们正在谈论一个新字符串。

于 2012-04-08T04:54:06.930 回答
3

除了你需要使用equals方法来比较java中的字符串这一事实

// it't allways a good idea to use constant.equals(...)
// to avoid possible NullPointerExceptions
if ("1".equals(shirt))
    ...

在您的情况下,您不必将角色转换为字符串,您也可以比较单个字符。在不创建额外的 String 对象的情况下执行相同的操作,并且您不必处理 equals 方法。

if (shirt1 == '1')
        ...
于 2012-04-08T05:03:21.370 回答
2

要比较字符串,请使用等于。

if(shirt.equals("1"))
     System.out.println("It's 1!");
    }else{
        System.out.println(shirt);
    }
于 2012-04-08T04:54:31.060 回答
1

一个更一般的规则是不要让代码变得比它需要的更复杂。

int shirt = (int)(Math.random() * 10); // shirt numbers from 0 to 9.
if(shirt == 1) 
    System.out.println("It's 1!");
else 
    System.out.println(shirt);

这说明==可用于比较原语。它也可以用来比较引用,但不能比较对象的内容。

Double d = 0.1;
Double e = 0.1;
System.out.println("(Double) 0.1 == (Double) 0.1 is " + (d == e));

double x = 0.1;
double y = 0.1;
System.out.println("0.1 == 0.1 is " + (x == y));

印刷

(Double) 0.1 == (Double) 0.1 is false
0.1 == 0.1 is true

这表明在比较时Double,像字符串一样,对象==不会比较内容。

当使用缓存时,所有这一切都会造成混淆,就像字符串文字一样。这意味着出于性能原因,在不同位置引用的值实际上使用相同的对象。

Integer d = 10;
Integer e = 10;
System.out.println("(Integer) 10 == (Integer) 10 is " + (d == e));

int x = 10;
int y = 10;
System.out.println("10 == 10 is " + (x == y));

印刷

(Integer) 10 == (Integer) 10 is true
10 == 10 is true

第一个示例有效,因为 Java 5.0+ 使用小整数缓存。(小整数的大小因命令行参数而异:})

Integer d = -129;
Integer e = -129;
System.out.println("(Integer) -129 == (Integer) -129 is " + (d == e));

int x = -129;
int y = -129;
System.out.println("-129 == -129 is " + (x == y));

印刷

(Integer) -129 == (Integer) -129 is false
-129 == -129 is true

至于字符串,使用字符串文字缓存。此外,编译器将简化常量表达式,因此以不同方式编写的字符串可以相同。

final int one = 1;
int oneB = 1;
String a = "1";
String b = "" + 1;
String c = "" + one;
String d = "" + oneB;

System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);

印刷

true
true
false

每个字符串的内容是相同的,但oneB不是一个常量,所以表达式在运行时被计算并产生一个不同的字符串。

恕我直言:Java 试图向开发人员隐藏详细信息,如果您真的想比较实际引用,则可以使用操作员进行==调用,这将是一个更好的选择。equals===

于 2012-04-08T09:47:24.343 回答