Java中的字符串:equals vs == [duplicate]
可能重复:
如何比较Java中的字符串?
String s1 = "andrei";
String s2 = "andrei";
String s3 = s2.toString();
System.out.println((s1==s2) + " " + (s2==s3));
给出以下代码为什么第二个比较s2 == s3为真?
实际上s2.toString()返回的是什么?实际位于何处(s2.toString())
?
没有找到相关结果
已邀请:
15 个回复
徘廷
是无操作:
其次,字符串常量被实现,因此s1和s2在后台更改为相同的String实例。
郡晒景沧
ed,所以
和
将引用相同的字符串。
只返回自身,即当a是一个字符串时,
返回a。所以,s2也== s3。 通常,字符串不应通过引用相等进行比较,而应通过值相等进行比较,使用
。原因是很容易得到两个相同但不同引用的字符串。例如,在创建子字符串时。此规则的一个例外是,如果您事先知道两个字符串已经被ѭ4(或者您将它们作为比较的一部分实习)。 要回答有关堆或堆栈的隐含问题,请在堆上分配字符串。即使它们被分配在堆栈上,例如即将进行的转义分析和堆栈分配,程序的语义也不会改变,并且您将获得堆和堆栈分配相同的结果。
拈吉勉犬姆
时,你就迫使Java创建一个全新的对象。 分配给字符串文字
时,该字符串存储在常量池中,由JVM完成优化。因此,当您为同一个常量指定另一个引用时,存储在常量池中的Object将被重用,基本上,它是同一个对象。
熊融炭臀陛
存储在一个特殊的RAM池中 称为perm gen,其中JVM 还加载类和商店 本机编译的代码。然而 intered Strings的行为没有区别 比他们存储在 普通对象堆。
抽法
是一个字符串文字,因此“实习”。因此String
和
都引用相同的String对象,一个内容为
的字符串。 因此
是
。
不会创建一个新的
(与
中的许多其他方法一样)但是简单的返回
。 Ther
是
。
呢率篓舍烫
。
淑灯
比较参考,你可以看到
是真的
返回s2。
财沟项胶
因此,与
相关的参考与与
相关的参考相同。 考虑到
声明,这是由于所有常量字符串自动调用
。这意味着在编译时,s2初始化代码将被替换为
,这使得断言非常明显,不是吗?
娜拐赐巫潭
)字符串可以安全地与
进行比较。 在你的情况下,你定义自己的类型
,它与java
有很小的共同点,所以比较
和
你比较对两个不同对象的引用,这就是为什么你得到
。
辅奈
的每个实例都位于不同的内存位置,因此,忘记实例的内容,对于每两个不同的实例,
测试将导致
。 在
类的情况下,当你分配一个
变量并且右手边算子是一个文字(即
)时,有一个很小但很重要的区别,一个新的记忆位置将被“foo”占用只有在以前没有遇到“foo”作为文字。如果是这种情况(即
),则
将引用已经存在的“foo”。 此行为称为字符串池。
敦肌
时,您正在比较两个不同的
对象。想想你的情况
和
是不同的对象,但它们的属性指向
的同一个实例。 由于您创建它们的方式,它们是不同的对象:
所以
将返回
。要让它返回
,它们必须是同一个物体。你可以这样做:
那将是结果
肉脓措伪
创建了两个对象。现在,
运算符会比较两个内存地址,这会产生你得到的返回值,因为这两个对象不在同一个内存单元格中。 它与常量字符串一起工作的原因是,java编译器
确实优化了代码。通过该优化,类似的字符串常量被放置在同一个存储器单元中。如果您已经完成以下操作,那么您的
对象的结果将是相同的。
你要走的路是.equals(其他)。 为此,你必须在类Mystring中实现equals方法:
磁辫覆氓
徐百晴墓斜
时,仅比较引用。因此,
仅保证在以下情况下返回
:
在这里,
。在所有其他情况下,即使两个字符串包含相同的字符序列,
可能会也可能不会返回
。 要比较两个字符串的内容,请使用
:
导力疵谜