我正在探索字符串常量池和堆内存。
if("String".trim() == "String")
System.out.println("Equal");
else
System.out.println("Not Equal");
输出
Equal
如果我在修剪之前在字符串中添加一个空格,它将给出不等于输出
if("String ".trim() == "String")
System.out.println("Equal");
else
System.out.println("Not Equal");
输出
Not Equal
你能解释一下上面的场景吗?
如何查看堆内存和字符串常量池?
最佳答案
(Java 8)javadocs对于 String.trim() 状态:
Returns: A string whose value is this string, with any leading and trailing white space removed, or this string if it has no leading or trailing white space.
由于 "String"
没有前导或尾随空格,因此 trim()
返回 "String"
对象。
另一方面,"String "
具有尾随空格,因此返回不同的 String
对象1。
顺便说一句:它不叫“字符串常量池”。所有字符串都是常量(不可变)。您可能正在谈论作为编译时常量表达式求值结果的所有字符串。但是,字符串池还可以包含通过动态创建的字符串调用 String.intern()
添加的字符串。正确的术语是“字符串池”。
1 - 该对象恰好与表示“String”
的对象不同。然而,仔细阅读 javadoc 将发现规范并不要求这种情况。在不同(假设的)Java 版本中,trim()
方法可以返回"String"
对象,并且仍然符合规范。
关于java - 为什么trim()给我字符串常量池引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44651646/