String.trim()为相同的引用对象返回false

时间:2013-04-15 08:01:21

标签: java

为什么 false

String str1 = new String("Java    ");
String str2 = str1;
System.out.println(str1.trim()==str2.trim());  //false

最初str2引用了str1个对象。因此,与==相比,str1==str2

将返回true

那为什么这个错误.trim()方法?

即使它为文字返回false(没有new关键字)

String str1 = "Java    ";  //this is now without new keyword
String str2 = str1;
System.out.println(str1.trim()==str2.trim());

注意:我知道如何使用.equals方法。但是想知道==行为,特别是在.trim()的情况下,上面给出了两个例子。

11 个答案:

答案 0 :(得分:4)

使用equals()equalsIgnoreCase()方法比较字符串。 ==比较对象标识。

答案 1 :(得分:4)

使用equal而不是==

System.out.println(str1.equals(str2.trim()));

答案 2 :(得分:4)

字符串在Java中是不可变的。 字符串文字也是实例化的,即java维护一个字符串文字池。

使用前2行创建一个对象,将2引用str1和str2引用到同一对象。

当对字符串应用trim()时,它会形成一个新的字符串对象,并将当前引用分配给新对象。 但由于在对象创建str1.trim()和str2.trim()时使用了new,因此最终都会创建2个独立的对象。

参考:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim%28%29

trim()方法创建一个新对象。由于您在同一对象上单独应用了trim()(虽然由多个引用str1和str2引用),因此创建了2个新对象。 这就是参考平等不起作用的原因。

答案 3 :(得分:2)

将字符串与equals进行比较,而不是==

答案 4 :(得分:1)

如果您想比较字符串的内容,则需要.equeals

您的(已修改)示例

String str1 = new String("Java    ");
String str2 = str1;
System.out.println(str1.trim().equals(str2.trim()));  //is now true

答案 5 :(得分:1)

对于字符串比较,您应该使用str1.equals(str2)str1.equalsIgnoreCase(str2)

要获得更多积分,请查看此question

答案 6 :(得分:1)

由于您使用的是String str1=new String("Java "); 您无法使用==运算符

如果您使用String str1="Java ";,则可以使用==

所以这里要么将代码更改为String str1="Java ";

或更改

System.out.println(str1.trim().equals(str2.trim())); 

答案 7 :(得分:1)

  

“==”

适用于参考函数trim创建一个具有新参考的新对象。这就是它总是会返回虚假的原因

答案 8 :(得分:0)

你有两个不同的字符串,所以有两个不同的引用。要比较内容,请使用equals()

答案 9 :(得分:0)

==将比较tow对象的if引用是否相同,因为它检查两个对象是否相同而不检查对象的内容。 由于string是一个对象,所以==只能使用相同的String类型的Object,而不检查字符串的内容。 检查String的内容 使用

  equals() or equalsIgnoreCase

答案 10 :(得分:0)

您正在使用==符号进行比较。在java中,这将比较实际对象,即两个变量是否指向内存中相同的物理对象,相同的内存位置。

如果您想比较字符串的实际内容,那么如果您不关心案例,则需要使用equals类(或String)的方法equalsIgnoreCase

这同样适用于任何其他类型的对象。如果使用==比较它们,则将比较两个变量的物理内存位置。您可以使用equals方法来比较对象的实际内容(前提是该类实际实现了此方法)。