为什么trim()给我String Constant Pool引用?

Kev*_*hva 2 java string compare

我正在探索String Constant Pool和Heap内存.

if("String".trim() == "String")
    System.out.println("Equal");
else
    System.out.println("Not Equal"); 
Run Code Online (Sandbox Code Playgroud)

产量

Equal
Run Code Online (Sandbox Code Playgroud)

如果我在修剪前在String中添加一个空格,它将给出Not Equal输出

if("String  ".trim() == "String")
    System.out.println("Equal");
else
    System.out.println("Not Equal");
Run Code Online (Sandbox Code Playgroud)

产量

Not Equal
Run Code Online (Sandbox Code Playgroud)

你能解释一下上面的情景吗?

我怎样才能看到堆内存和字符串常量池?

Ste*_*n C 7

该(Java 8)的javadocString.trim()状态:

返回:一个字符串,其值为此字符串,删除了任何前导和尾随空格,如果没有前导或尾随空格,则为此字符串.

由于"String"没有前导或尾随空格,trim()因此返回"String"对象.

另一方面"String "有尾随空格,因此String返回一个不同的对象1.

BTW:它不被称为"字符串常量池".所有字符串都是常量(不可变).您可能正在讨论编译时常量表达式评估结果的所有字符串.但是,字符串池还可以包含通过String.intern()调用动态创建的字符串添加的字符串.正确的术语是"字符串池".


1 - 碰巧这个对象与表示对象的对象不同"String".但是,仔细阅读javadoc将会发现规范并不要求这样.在Java的不同(假设)版本中,该trim()方法可以返回"String"对象并仍然符合规范.