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

时间:2017-06-20 11:19:32

标签: java string compare

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

if("String".trim() == "String")
    System.out.println("Equal");
else
    System.out.println("Not Equal"); 

输出

Equal

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

if("String  ".trim() == "String")
    System.out.println("Equal");
else
    System.out.println("Not Equal");

输出

Not Equal

你能在上面的场景中解释一下吗?

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

4 个答案:

答案 0 :(得分:7)

String.trim()州的(Java 8)javadocs

  

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

由于"String"没有前导或尾随空格,trim()正在返回"String"对象。

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

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

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

答案 1 :(得分:1)

trim()方法可以返回相同的实例或全新创建的字符串对象,可以在方法的源代码中验证:

 return ((st > 0) || (len < value.length)) ? substring(st, len) : this;

所以这取决于这种情况是否符合

((st > 0) || (len < value.length))

现在当你这样做时:"String".trim() == "String"条件不符合,所以你将比较文字的引用&#34; String&#34;

左边的选项

,创建一个新对象,使用==的比较返回false ....

答案 2 :(得分:0)

第二个例子显示&#34; Not Equal&#34;因为,

  

方法trim()会返回此字符串的副本,并删除前导和尾随空格,如果没有前导或尾随空格,则返回此字符串。

复制一词很重要。

答案 3 :(得分:-2)

字符串是对象,因此将字符串与==进行比较不是正确的选择。 Trim返回一个String,然后您需要使用equals将它与另一个String进行比较,即使该字符串未包装到变量中也是如此。尝试使用:

System.out.println(&#34;这是一个字符串&#34; .trim());

字符串测试=&#34;这是一个字符串&#34 ;; 的System.out.println(test.trim());

两者都会给出相同的答案:&#34;这是一个字符串&#34;

我的情况你应该使用:

"string".trim().equals("string")

将为您提供正确的答案。