【问题标题】:String array vs String split array [duplicate]字符串数组与字符串拆分数组[重复]
【发布时间】:2016-03-22 05:22:57
【问题描述】:
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 会在不检查文字池的情况下创建新值。这样对吗?我错过了什么吗?

【问题讨论】:

  • 在网站上快速搜索一下,在询问之前,会是一个好主意,有很多类似的问题..

标签: java arrays string split


【解决方案1】:

原因是编译器。在编译时,编译器确实注意到文字 Hi 在代码中存在两次,并为您的特定类执行此字符串。 编译后,您的两个实习字符串Hi 都指向Hi 的相同引用。这就是第二次打印结果为true 的原因。

split 不知道它的结果并为相应的Strings 创建新的引用。这就是为什么拆分中的Hi 和文字Hi 没有使用相同的引用的原因。

【讨论】:

    【解决方案2】:

    这是因为在内部当split(Pattern) 匹配模式并找到匹配的字符序列时,它使用String.substring(start,end) 创建new String object。这就是为什么 split 返回的结果是false。这是来自java.util.regex.Pattern.split(CharSequence input, int limit) 类的代码 sn-p。

    String match = input.subSequence(index, m.start()).toString();
    

    这里的input 是String 类的实例,它被传递给Pattern.split(CharSequence, int) 方法。

    参考:Pattern

    【讨论】:

      【解决方案3】:

      尝试在字符串上使用 '==' 是非常不可预测的。第一次输入“Hi”作为文字时,它会保存到内存中。然后,当您将其分配给数组“e”时,它使用相同的保存文字将其存储在数组中。然后,当您检查它们是否相等时,它会解析为 true。

      我强烈建议不要使用“==”,而是使用 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));
      

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2016-08-04
        • 2014-05-16
        • 2016-08-07
        相关资源
        最近更新 更多