比较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
。