2009-12-02 64 views
0
String string1 = "Hi there"; 
String string2 = "Hi"; 
String string3 = "Hi"; 

System.out.println(string1.substring(0, string2.length()) == string2); //1 
System.out.println(string1.substring(0, string2.length()).equals(string2)); //2 
System.out.println(string1.substring(0, string2.length()).compareTo(string2)); //3 
System.out.println(string2 == string3); //4 
System.out.println(string2.substring(0) == string3); //5 
System.out.println(string2.substring(0) == string3.substring(0)); //6 

比较字符串给我的输出:在Java

false 
true 
0 
true 
true 
true 

我真的不明白的第一行,为什么它给我假?

如果我添加一个空格串2并此行中我得到错误的,但如果我添加没有空格,我得到真正:

System.out.println(string2.substring(0, string3.length()) == string3); 

为什么要排队1给我假,但6号线是真实的,但如果我添加一个空格,以STRING2这是假的..

感谢=)

+5

这是怎么回事? http://stackoverflow.com/search?q=Comparing+strings+in+java在输入问题信息时,您没有看到列表中包含主题下的所有链接的列表吗?你是否打算按照建议的链接?为什么不? – BalusC 2009-12-02 15:19:25

回答

14

有几件事情在那里。

当你声明两个字符串等于“Hi”时,java会优化它以引用相同的字符串对象(所以它不必存储相同的字符串两次)。

“==”比较引用。在第1行中使用子字符串时,创建的字符串对象具有与string2不同的引用。

在第6行,我想substring(0)有一个优化,它知道它可以返回原始字符串,因此这些引用是相等的。

+0

+1的详细解释 – Yacoby 2009-12-02 15:22:13

+0

有这些优化总是在Java?我似乎回想起在Java 2中可能没有返回不同结果的练习,但是我的记忆有点模糊。 – FrustratedWithFormsDesigner 2009-12-02 15:26:57

+2

也许,也许不是。无论哪种方式,这是一个完美的例子,你应该永远不要依靠这样的优化。如果你需要比较'String',* always *使用'equals()',*永远不要使用'=='! – Bombe 2009-12-02 17:12:24

4

如果两个对象是相等的==操作符是检查(是他们引用同一个对象),而不是比较值containes在其中。

+0

那么,为什么4,5和6回归真实? – 2009-12-02 15:20:17

+0

@Tor:Jean Barmash击败了我; – FrustratedWithFormsDesigner 2009-12-02 15:25:58

+0

这是马虎而混淆的术语:==运算符不检查两个OBJECTS是否相等;它检查两个变量是否引用同一个对象。变量不是对象 - 变量是对象的引用。 – Jesper 2009-12-02 15:53:44

7

如果你想比较字符串,那么你应该使用String.equals()(或String.equalsIgnoreCase())的方法。比较==只有在两个参考指向同一个对象时才会告诉您。在你的例子中是这样的:string2和string3指向字符串"Hi"的相同实例(为什么Java应该在编译时创建两个完全相同的字符串)

+1

+1。另外值得注意的是,通常情况下,对于从方法返回的对象的实例几乎没有保证 - 如果方法可以自由使用实例缓存,使用动态代理等,方法通常可以做更好的事情。重要的是不要挂在对象平等上,在一般情况下使用'equals()',只有在确实需要的时候才比较引用。 – 2009-12-02 15:24:06

1

==比较引用 - 字符串的地址不是它的价值。为了比较字符串,你应该使用equals。 JVM将处理新的String对象,所以如果存在一个相同值的对象(string2 vs string3),它可能引用同一个对象。

1

==运算符将2个引用与相同的字符串相比较。

String类有两个方法,你应该使用比较两个字符串是否相等:

String1.equals(String2); 

返回true如果字符串1和字符串是相同的(包括字母的大小写)。

如果你不关心的话,那么你可以使用:

String1.equalsIgnoreCase(String2); 

如果字符串1和字符串是相等的,无论情况(显然)这个返回true。

2

Java为 测试相等提供了两个基本机制。可以使用“==” 运算符来测试基本值是否相等,也可以是 用于确定两个对象是否指向相同的 基础对象。对于Java对象, 如果参数等于调用该方法的对象 ,则equals(Object)方法将返回 ,其中 对象的类语义定义了相等性。

由于字符串是对象,如果 两个字符串具有相同的内容,即 ,在同 顺序相同的字符的 等于(Object)方法将返回true。 ==运算符只有在 为真时,如果两个字符串引用指向 相同的基础字符串对象。由equals(Object)方法测试 当 表示 相同内容因此两个字符串将是相等的,但将仅 通过等于当与== 操作者测试它们是否实际上是相同的 对象。

从JavaTechniques引用:http://javatechniques.com/public/java/docs/basics/string-equality.html

1

线4,5,和6是true因为在substring(int, int)java.lang.String的方法中,以下行的:

return ((beginIndex == 0) && (endIndex == count)) ? this : 
    new String(offset + beginIndex, endIndex - beginIndex, value); 

由于子你是请求开始于0并且具有完整字符串的长度,您只需返回对字符串本身的引用,以便a.substring(0) == a