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添加一个空格,那就错了..
谢谢=)
答案 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
。