Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java基本问题:字符串相等_Java_String_Equality - Fatal编程技术网

Java基本问题:字符串相等

Java基本问题:字符串相等,java,string,equality,Java,String,Equality,上述程序输出为“真”。这两个都是两个不同的标识符/对象,输出如何为“真” 我的理解是,JVM将为每个对象创建不同的引用,如果是这样的话,输出是如何正确的 您没有比较字符串的内容。您只是在比较对象的引用。您应该使用equal方法(它是String类的成员)。或者您可以使用compareTo方法(也在同一字符串类下)检查返回值是否为零 请注意,上面的文字更强烈地暗示了问题的原始状态,因为OP似乎不知道幕后正在进行的实际过程 其他人认为内林是对的。为了回答这个问题,我没有足够的时间去看Java拼图书。

上述程序输出为“真”。这两个都是两个不同的标识符/对象,输出如何为“真”


我的理解是,JVM将为每个对象创建不同的引用,如果是这样的话,输出是如何正确的

您没有比较字符串的内容。您只是在比较对象的引用。您应该使用equal方法(它是String类的成员)。或者您可以使用compareTo方法(也在同一字符串类下)检查返回值是否为零

请注意,上面的文字更强烈地暗示了问题的原始状态,因为OP似乎不知道幕后正在进行的实际过程


其他人认为内林是对的。为了回答这个问题,我没有足够的时间去看Java拼图书。我确实怀疑在编译时设置相同的引用,但我也不知道如何找到对它的引用

Java管理
String
literal池。它可以重用这些文本。因此,这两个对象实际上是相同的
字符串
对象,
=
返回true

我认为这被称为

,因为

字符串文本,或者更一般地说, 字符串的值 常量表达式(§15.28)-为 “实习”以分享独特的 实例,使用 实习医生


==检查变量是否指向对象的完全相同实例。您创建的两个字符串文本指向内存中的同一位置,因此它们是相等的。字符串文字被插入内存,以便相同的字符串文字在内存中是相同的对象

如果你要做

public class A {

    static String s1 = "I am A";

    public static void main(String[] args) {
        String s2 = "I am A";
        System.out.println(s1 == s2);
    }
}

然后==将返回false,s.equals(t)将返回true。

这是因为编译器执行了内存优化。。。也就是说,
String
常量(即由相同的
String
literal创建的-
String
s)使用相同的
String
对象,因为
String
是不可变的。
=
操作符只是检查两个对象是否是相同的实际对象

如果你能抓到约书亚·布洛赫和尼尔·加夫特的《Java拼图者》一书,看看拼图13,“动物农场”。。。他在这个问题上有很好的建议。我将复制一些相关文本:

“您可能知道,
String
类型的编译时常量是插入的[JLS 15.28]。换句话说,指定相同字符序列的任何两个
String
类型的常量表达式都由相同的对象引用表示…您的代码应该很少(如果有的话)依赖于字符串常量的插入。插入仅用于减少虚拟机的内存占用,而不是作为虚拟机的工具程序员…在比较对象引用时,应优先使用
equals
方法而不是
=
运算符,除非需要比较对象标识而不是值。”


这是我上面提到的参考资料。。。我的书第30-31页。

有关字符串池的信息,请看维基百科:(+1相同的想法)是的,字符串文本是自动插入的,根据插入方法API-插入的不仅仅是文本,还有编译时间常数。请,请,请。。。正如我的回答所指出的。。。不要依赖这个事实。如果您的意思是-,请使用
equals
。当人们如此漫不经心地发布关于弦乐实习的消息时,我总是很紧张。。。显然,答案是正确的,我并不反对这一点,但我想强调的是,虽然它解释了答案,但它不是应该依赖的东西(正如Josh Bloch指出的,它是一个实现细节,而不是一个程序员的工具)。语言规范中强制要求的东西与实现细节几乎无关,但我同意:虽然你可以依赖于文本被拘留,但你不应该依赖于你使用的字符串是文本——这太容易改变了。@Felix。不,他是在比较参考文献,结果是正确的——这正是引发这个问题的稍微令人惊讶的结果。在我看来,这家伙因为接近主题的胡言乱语而被否决,这是一个怪人,当我第一次读到这个问题时,一个完全错误的答案竟然投了一些赞成票。@Steve De Caux:我知道:-)。像这样的答案我倾向于不去管。这些答案的作者往往只是误读了问题,或者没有意识到问题的重要部分是什么。我倾向于对那些信息完全错误或偏离目标的帖子投反对票(例如,Pavel的答案)。我感到沮丧的是,现在当人们来到这个页面时(大部分情况下),他们只会对被接受的答案投反对票。在另一个答案已经获得了大量的赞成票或被接受之后,要提交一个深思熟虑或写得很好的答案是相当困难的。我的观点是,在问题的第一次迭代中,他没有提到他理解引用人的交易,所以我插话说这是关于引用人的。。。然后我出去检查这个角落的案子为什么会存在。我提到了这个(当然我没有提到它为什么这么做),我被否决了。
String s = new String("foo");
String t = new String("foo");