比较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添加一个空格,那就错了..

谢谢=)

那里发生了几件事。

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

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

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

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

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

Java提供了两种测试相等性的基本机制。 “==”运算符可用于测试原始值的相等性,也可用于确定两个对象引用是否指向同一个底层对象。 对于Java对象,如果参数等于调用方法的对象,则equals(Object)方法将返回true,其中等式由对象的类语义定义。

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

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

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

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

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

 String1.equals(String2); 

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

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

 String1.equalsIgnoreCase(String2); 

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

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

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

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