Java 用爪哇语;字符串";==&引用;“字符串”;是假的为什么?

Java 用爪哇语;字符串";==&引用;“字符串”;是假的为什么?,java,Java,以下语句出现在第节中: 字符串文本始终引用类字符串的同一实例。 这是因为字符串文字,或者更一般地说,是 常量表达式(§15.28)的值被“插入”以便 使用String.intern方法共享唯一实例 我正在使用JavaJDK7和EclipseIndigo 我的测试程序如下: public class Main { public static void main(String[] args) { String s1 = "string"; String s2

以下语句出现在第节中:

字符串文本始终引用类字符串的同一实例。 这是因为字符串文字,或者更一般地说,是 常量表达式(§15.28)的值被“插入”以便 使用String.intern方法共享唯一实例

我正在使用JavaJDK7和EclipseIndigo

我的测试程序如下:

public class Main {

    public static void main(String[] args) {
        String s1 = "string";
        String s2 = "string";

        System.out.print(s1 == s2); // true
        System.out.print(" , " + "string" == "string"); // false
    }

}

这是一个运算符优先级问题。
=
运算符的优先级低于
+
运算符

您实际测试的是
(“,”+“string”)
是否等于
“string”
。事实并非如此

如果您的意思是要比较
“string”
“string”
,您应该写:

    System.out.print(" , " + ("string" == "string"));


不使用
==
测试字符串的标准建议也适用于。。。但这并不是让您产生混乱输出的原因。

这是一个运算符优先级问题。
=
运算符的优先级低于
+
运算符

您实际测试的是
(“,”+“string”)
是否等于
“string”
。事实并非如此

如果您的意思是要比较
“string”
“string”
,您应该写:

    System.out.print(" , " + ("string" == "string"));


不使用
==
测试字符串的标准建议也适用于。。。但这并不是让您产生混乱输出的原因。

这就是运算符优先级。第二项检查是:

" , " + "string" == "string"
即:

(" , " + "string") == "string"

这当然是错误的。

这就是所有运算符的优先级。第二项检查是:

" , " + "string" == "string"
即:

(" , " + "string") == "string"

这当然是错误的。

因为
+
的优先级高于
=
。如果代码重写为

System.out.print(" , " + ("string" == "string"));

它按预期显示
true

因为
+
的优先级高于
=
。如果代码重写为

System.out.print(" , " + ("string" == "string"));

它按预期显示
true

这是因为“,”在应用等于运算符之前被连接到“字符串”

这是因为“,”在应用等于运算符之前被连接到“字符串”

它在添加逗号','到第一个字符串,然后应用相等运算符。+优先级高于==且从左到右。

Its在第一个字符串中添加逗号“,”,然后应用相等运算符。+优先级高于==且从左到右。

如果将字符串与“==”进行比较,则始终会得到true。。。它比较对象,而不是“内容”。。。字符串是一个字符串。。。在那种情况下,你不能弄错。。。但是使用方法equals()可以检查两个字符串的内容是否相等。

如果将字符串与“==”进行比较,您将始终得到true。。。它比较对象,而不是“内容”。。。字符串是一个字符串。。。在那种情况下,你不能弄错。。。但是使用方法equals(),您可以检查两个字符串的内容是否相等。

s1.equals(s2),、字符串不是原始数据类型
==
比较对象。如果要比较它们的内容,请使用
equals
compareTo
。是的,我知道如何使用
equals(…)
来比较字符串。我想问的是,为什么在这种情况下,我的程序没有表现出与JLS.s1.equals(s2),,,String不是原始数据类型
==
比较对象相匹配的行为。如果要比较它们的内容,请使用
equals
compareTo
。是的,我知道如何使用
equals(…)
来比较字符串。我想问的是,为什么在这种情况下,我的程序没有表现出与JLS相匹配的行为。哇,你到底是怎么知道的?@JRL-这里重要的是运算符优先级,而不是从左到右的规则。(试试打印(“string”==“string”+”))@leftbrain-只有30多年的编程经验:-)。还有一个重要的线索是程序将输出
“truefalse”
,而不是
“真,假”
@StephenC-说真的,这是我几周来看到的最好的评论。哇,你到底是怎么知道的?@JRL-这里重要的是运算符优先级,而不是从左到右的规则。(试试打印(“string”==“string”+”))@leftbrain-只有30多年的编程经验:-)。还有一个重要的线索是程序将输出
“truefalse”
而不是
“真,假”
@StephenC-说真的,这是我几周来看到的最好的评论。嗯。。。恐怕你弄错了。作为一个学习练习,执行以下代码并查看您得到的
System.out.print(“a”==“B”)
系统输出打印(新字符串(“A”)==新字符串(“A”))
。它们都是字符串对象,因此根据您的语句,执行该代码的结果应该是
true
。暗示这不是真的。您可能需要阅读第3.10.5节。Java语言规范.Hmmm中的字符串文本。。。恐怕你弄错了。作为一个学习练习,执行以下代码并查看您得到的
System.out.print(“a”==“B”)
系统输出打印(新字符串(“A”)==新字符串(“A”))
。它们都是字符串对象,因此根据您的语句,执行该代码的结果应该是
true
。暗示这不是真的。您可能需要阅读第3.10.5节。Java语言规范中的字符串文本。