java - 为什么trim()给我字符串常量池引用?

标签 java string compare

我正在探索字符串常量池和堆内存。

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/

相关文章:

java - 如何以正确的方式创建对象数组?

c# - 用空格和#字符替换#字符

javascript - 比较两个数组并使用纯 javascript 或 jquery 创建两个缺少元素和新元素的新数组

java单例网络实现runnable

java - 为什么 httpServletRequest.getLocalPort 总是返回与 getServerPort 相同的值?

mysql - 带有 WHERE 子句的 SELECT 作为字符串存储在另一个表中

Java正则表达式替换大字符串中的多个文件路径

java - 无法比较两个日期 java,使用 SimpleDateFormat "dd/MM/YYYY hh:mm:ss a"将字符串转换为日期时转换无效

php - 准备使用php脚本来比较mysql表

java - 安装失败,并显示消息 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED