class test {
public static void main(String[] args) {
String a = "Hiabc";
String b = "abc";
String c = "abc";
System.out.println(a.substring(2,5)==b);
System.out.println(b==c);
}
}
output:
false
true
据我所知,Java的==寻找两个比较对象的地址。但是,我不明白为什么b == c是真的,因为它们必须有不同的地址。另外,如果b == c,那么为什么a.substring(2,5),即“abc”== b false?
答案 0 :(得分:1)
据我了解,Java = =查找两个比较对象的地址。
几乎正确。 Java使用引用而不是地址,例如引用是强类型的:请参阅https://softwareengineering.stackexchange.com/questions/141834/how-is-a-java-reference-different-from-a-c-pointer
为什么b == c为真
变量b
和c
使用相同的字符串引用进行初始化,因为它们引用相同的string literal "abc"
。
为什么子串表达式不引用字符串文字“abc”?
因为substring()的javadoc说
返回一个新字符串,该字符串是此字符串的子字符串。
因此该方法不能确保返回对常量池中字符串的引用。如果你想要这个你必须这样做
a.substring(2,5).intern()
而不是
a.substring(2,5).intern()==b
将是true
。
答案 1 :(得分:0)
永远不要在Java中将字符串与==进行比较。 改为使用.equal或.equalIgnoreCase方法。
a.substring(2,5)和b之间的区别是因为substring创建了另一个String对象,它位于与b不同的位置。这不是人物......