我正在探索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
你能在上面的场景中解释一下吗?
我怎样才能看到堆内存和字符串常量池?
答案 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)
答案 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")
将为您提供正确的答案。