【问题标题】:Difference between substring and string in java [duplicate]java中子字符串和字符串之间的区别[重复]
【发布时间】:2014-10-05 17:23:51
【问题描述】:
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?

【问题讨论】:

  • 因为substring 创建了一个新对象bc 引用池中的 same 字符串。
  • 您能详细解释一下“池”吗?你的意思是Java有所有的字符串库?
  • 谷歌一下,Java字符串池的资源是无穷无尽的。

标签: java string substring equals


【解决方案1】:

据我了解,Java 的 == 会查找两个比较对象的地址。

几乎正确。 Java 使用引用而不是地址,例如引用是强类型的:参见https://softwareengineering.stackexchange.com/questions/141834/how-is-a-java-reference-different-from-a-c-pointer

为什么 b==c 为真

变量bc使用相同的字符串引用进行初始化,因为它们引用了相同的string literal"abc"

为什么子字符串表达式不引用字符串字面量“abc”?

因为substring() 的javadoc 说

返回一个新字符串,它是该字符串的子字符串。

因此该方法不确保返回对常量池中字符串的引用。如果你想要这个,你必须这样做

a.substring(2,5).intern()

a.substring(2,5).intern()==b

将是true

【讨论】:

  • 为什么子字符串表达式不引用字符串字面量“abc”?
【解决方案2】:

永远不要在 Java 中将字符串与 == 进行比较。 请改用 .equal 或 .equalIgnoreCase 方法。

a.substring(2,5) 和 b 的区别在于 substring 创建了另一个 String 对象,并且它位于与 b 不同的位置。这与角色无关......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2011-03-18
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2016-10-22
    • 2011-06-15
    • 2018-11-12
    相关资源
    最近更新 更多