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");