为什么 false ?
String str1 = new String("Java ");
String str2 = str1;
System.out.println(str1.trim()==str2.trim()); //false
最初str2
引用了str1
个对象。因此,与==相比,str1==str2
那为什么这个错误与.trim()
方法?
即使它为文字返回false(没有new关键字)
String str1 = "Java "; //this is now without new keyword
String str2 = str1;
System.out.println(str1.trim()==str2.trim());
注意:我知道如何使用.equals
方法。但是想知道==
行为,特别是在.trim()的情况下,上面给出了两个例子。
答案 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
方法来比较对象的实际内容(前提是该类实际实现了此方法)。