当我运行一些代码(稍后显示)时,我告诉它检查字符串==“1”,如果是,输出“它是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
答案 0 :(得分:9)
您需要使用
if (shirt.equals("1"))
...
这将比较String对象的实际内容,而不是它们的身份。
答案 1 :(得分:5)
您已经让Java初学者错误地使用==
来测试字符串相等性。请改用equals
方法。
更长的解释是Java中的==
运算符测试两个对象引用是否相同;即它测试左右操作数是否是同一个对象。但你有两个不同的字符串,包含相同的字符序列。它们是“相等”的字符串,但不是同一个对象。
作为一般经验法则,您应始终使用equals
来比较字符串。
(在某些情况下==
会起作用,但你确实需要了解自己在做什么才能确定。在绝大多数用例中,它根本不值得付出努力/风险。 )
答案 2 :(得分:4)
要检查Java中的两个字符串是否相同,请使用.equals()
:
"1" == new String("1") //returns false
"1".equals(new String("1")) //returns true
编辑:添加了新的字符串(“1”)以确保我们正在谈论一个新的字符串。
答案 3 :(得分:3)
除了你需要使用equals方法来比较java中的字符串
之外// it't allways a good idea to use constant.equals(...)
// to avoid possible NullPointerExceptions
if ("1".equals(shirt))
...
在您的情况下,您不必将您的角色转换为String 你也可以比较单个字符。 如果不创建额外的String对象,则不必处理equals方法。
if (shirt1 == '1')
...
答案 4 :(得分:2)
比较字符串使用equals。
if(shirt.equals("1"))
System.out.println("It's 1!");
}else{
System.out.println(shirt);
}
答案 5 :(得分: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
时,与字符串一样,对象==
不会比较内容。
使用缓存时,所有这一切都会产生混淆,就像String文字的情况一样。这意味着出于性能原因,在不同位置引用的值实际上使用相同的对象。
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
可能是更好的选择实际参考。