【问题标题】:Why does contains() method find empty string in non-empty string in Java为什么 contains() 方法在 Java 中的非空字符串中查找空字符串
【发布时间】:2018-08-27 18:12:07
【问题描述】:

这是我在 Java 的 String.indexOf() 和 String.contains() 方法中发现的一种奇怪行为。如果我有一个 non-empty 字符串显示blablabla,并且我尝试在其中查找一个空字符串,它总是返回true,而我希望它返回false。

那么基本上,为什么下面的代码返回 true 和 0 ?

String testThis = "";
String fileName = "blablablabla";
System.out.println(fileName.contains(testThis));
System.out.println(fileName.indexOf(testThis));

从逻辑上讲(至少对我而言)"" 不会出现在 blablablabla 中,但 indexOf("") 说会出现,为什么?

【问题讨论】:

  • 你如何证明文件名的开头没有空字符串?您必须找到出现在空字符串中但未出现在 fileName 中的字符。
  • Ï 想,至少这就是我在这里的原因,对“”的包含搜索应该抛出异常,因为它不合逻辑。我敢肯定,从 30 年前的一些 c 基本态度来看,这符合旧编译器。但对于 普通 人来说,这不合逻辑。

标签: java string


【解决方案1】:

每个字符串都出现一个空字符串。具体来说,字符串的连续子集必须与空字符串匹配。任何空子集都是连续的,并且任何字符串都有一个空字符串作为这样的子集。

当且仅当此字符串包含指定的 char 值序列时返回 true。

在任何字符串的开头、结尾和字符之间都存在一组空的 char 值。从任何事物中,您都无法提取任何东西。从一条物理的字符串/纱线中,我可以说其中存在一个零长度部分。

如果 contains 返回 true,则可能会调用 substring( 来获取要查找的字符串。 "aaa".substring(1,1) 应该返回 "",但不要引用我的话,因为我目前没有 IDE。

【讨论】:

  • @george_h 开始更像是没用的正式 :D
  • 如果需要解释,那是不合逻辑的。这只是它们本来的样子之一。如果字符串总是包含空,则搜索毫无意义,应该让开发人员意识到这一点。
  • @Christian 如果字符串不包含空子字符串,那么 contains 的定义将与数学理论严重不一致,这可以说是更糟。
【解决方案2】:

"" 出现在每个字符之间,也出现在开头和结尾。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2021-07-17
    • 2012-05-10
    • 2013-08-13
    • 2011-11-27
    • 2021-12-03
    相关资源
    最近更新 更多