比较java中的字符串

时间:2009-12-02 15:15:18

标签: java

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

给我输出:

false
true
0
true
true
true

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

如果我向字符串2添加一个空格,这行我得到假,但如果我没有添加空格,我会得到真的:

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

为什么第1行给我假,但第6行是真的,但是如果我给string2添加一个空格,那就错了..

谢谢=)

7 个答案:

答案 0 :(得分:14)

那里发生了几件事。

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:4)

==运算符正在检查两个OBJECTS是否相等(它们是否引用同一个对象),而不是比较其中包含的值。

答案 3 :(得分:2)

  

Java提供了两种基本机制   测试平等。 “==”   运算符可用于测试原语   平等的价值观,也可以   用来判断两个对象   引用指向相同   基础对象。对于Java对象,   equals(Object)方法将返回   如果参数等于,则返回true   调用该方法的对象,   等式由...定义   对象的类语义。

     

由于字符串是对象,   equals(Object)方法将返回true   如果两个字符串具有相同的内容,   即,相同的字符   订购。 ==运算符只会是   如果两个String引用指向,则返回true   相同的底层String对象。   因此两个字符串代表   测试时相同的内容将是相同的   通过equals(Object)方法,但是会   只有在使用==进行测试时才相等   运算符,如果它们实际上是相同的   对象

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

答案 4 :(得分:1)

==比较引用 - 字符串的地址而不是它的值。要比较字符串,您应该使用equals。 JVM将处理新的String对象,因此如果存在相同值的对象(string2 vs string3),它可能引用相同的对象。

答案 5 :(得分:1)

==运算符将2个引用与同一个字符串进行比较以获得相等。

String类有两个方法可用于比较两个字符串是否相等:

String1.equals(String2);

如果String1和String2相同(包括字母的大小写),则返回true。

如果你不关心这个案子,那么你可以使用:

String1.equalsIgnoreCase(String2);

如果String1和String2相等则无论情况如何都会返回true(显然)。

答案 6 :(得分: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