String s = "Hi Hello Hola";
String[] d = s.split(" ");
System.out.println(d[0] == "Hi"); // prints false
String[] e = { "Hi", "Hello", "Hola" };
System.out.println(e[0] == "Hi"); // prints true
此处我们有一个数组d
,其值为Hi
,Hello
和Hola
。我们有另一个具有相同值集的数组e。
但为什么这种比较表现不同?为什么它打印错误然后是真的?
我预计两者都是假的!我们正在使用==
将字符串文字值与字符串值进行比较。
为什么会有这种差异?
更新这里我的问题不是字符串值的比较。我知道比较引用的==
和比较字符串内容的equals()
之间的区别。
从答案中,我理解在第二种情况下,Hi
值被实习并引用同一个对象。但在另一种情况下,split会在不检查文字池的情况下创建新值。这样对吗?我错过了什么吗?
答案 0 :(得分:1)
beeing的原因是编译器。在编译时,编译器确实注意到文本Hi
在代码中存在两次,并为您的特定类实际执行此字符串。
编译后,两个实习字符串Hi
都指向Hi
的相同引用。这就是第二次打印产生true
的原因。
split
不知道结果,并为相应的Strings
创建新的引用。这就是为什么来自分裂的Hi
和文字Hi
没有使用相同的引用的共鸣。
答案 1 :(得分:1)
发生这种情况是因为在split(Pattern)
匹配模式的内部,并找到匹配的char序列,然后它使用String.substring(start,end)
来创建new String object
。这就是拆分返回的结果为false
的原因。这是java.util.regex.Pattern.split(CharSequence input, int limit)
类的代码段。
String match = input.subSequence(index, m.start()).toString();
这里input
是String
类的实例,它被传递给Pattern.split(CharSequence,int)方法。
参考:Pattern
答案 2 :(得分:0)
尝试在字符串上使用'=='是非常不可预测的。第一次键入“Hi”作为文字时,会将其保存到内存中。然后,当您将其分配到数组“e”时,它使用相同的已保存文字将其存储在数组中。当您检查它们是否相等时,它会解析为真。
我强烈建议不要使用'=='并使用Java中提供的众多方法之一。
System.out.println("Hi".equals(d[0]));
System.out.println("Hi".equals(e[0]));
...或
System.out.println(("Hi".compareTo(d[0]) == 0));
System.out.println(("Hi".compareTo(e[0]) == 0));