String array vs String split array

时间:2015-12-16 07:05:45

标签: java arrays string split

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,其值为HiHelloHola。我们有另一个具有相同值集的数组e。

但为什么这种比较表现不同?为什么它打印错误然后是真的?

我预计两者都是假的!我们正在使用==将字符串文字值与字符串值进行比较。

为什么会有这种差异?

更新这里我的问题不是字符串值的比较。我知道比较引用的==和比较字符串内容的equals()之间的区别。

从答案中,我理解在第二种情况下,Hi值被实习并引用同一个对象。但在另一种情况下,split会在不检查文字池的情况下创建新值。这样对吗?我错过了什么吗?

3 个答案:

答案 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();

这里inputString类的实例,它被传递给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));