使用 String.indexOf 搜索长度为 0 的字符串 "" 的行为是否应被视为未定义?

Should searching behavior for 0-length string "" using String.indexOf be considered as undefined?

[已编辑]
由于有些人难以理解这个问题的全部内容,我将添加一行或几行。在谈到API时,有一个叫做UNDEFINED BEHAVIOR的东西,意思是作者不保证某些程序动作的结果。这个术语源于 z80 处理器时代,当时狡猾的程序员正在利用未记录的操作码。这些操作码有时在优化中很方便,但本应 被认为是 UNDEFIND,即使这些操作码在当时产生了一致的结果。然而,随着时间的推移,公司开始制作 z80 兼容环境而不复制这些未记录的操作码的行为,你猜怎么着,那些使用这些操作码的程序现在已经崩溃了。

这个故事的寓意是您不应依赖未定义的编程组件,例如未定义的操作码或未正确定义的 API 组件,因为它们的结果可能会不时更改。

现在我们有一个 Java 的特定方法,在特定条件下会产生一些奇怪的结果。所以我问我是否应该将其结果视为未定义的行为或可靠的官方结果。这个问题可能有点技术性,除非你有一些背景,比如 API 编程或低级编程,但我仍然不认为我的问题含糊不清,因为已经有人回答了我的问题。


我们都知道 indexOf("") returns 0,尽管官方没有记录。 但是你知道当使用 indexOf("", int num) 时会发生什么吗? int num 是比 0 更合乎逻辑的答案,如果字符串 undet 测试长于 num.

,它确实 returns num

但是那些字符串较短的呢?那么旧版本的Java根据它的源代码应该是return-1,因为它在一开始就对str.length() <= num情况进行了防范。但是,我只是注意到 Java return 的 android 版本取而代之的是 str.length() 的值。

所以现在我很想知道“”搜索的行为应该被认为是不可靠的。说可靠,我的意思是任何依赖这些行为的代码都不会在 Java.

的未来版本中崩溃

Javadoc 指出:

int java.lang.String.indexOf(String str, int fromIndex)

Returns the index within this string of the first occurrence of the specified substring, starting at the specified index.

The returned index is the smallest value k for which:

k >= fromIndex && this.startsWith(str, k)

If no such value of k exists, then -1 is returned.

如果你传fromIndex > str.length,不可能有k使得k >= fromIndex && this.startsWith(str, k),所以应该return-1.

但是,正如您所说,这不是实现的行为。 indexOf(String str, int fromIndex) 来电:

static int indexOf(char[] source, int sourceOffset, int sourceCount,
                  char[] target, int targetOffset, int targetCount,
                  int fromIndex)

开头为:

if (fromIndex >= sourceCount) {
    return (targetCount == 0 ? sourceCount : -1);
}

targetCount是传递给indexOfString的长度,sourceCount是你调用[=]的String的长度20=],这意味着如果 fromIndex >= str.length()str.length() 在您调用 str.indexOf("",fromIndex).

时被 returned

这是文档错误或实施错误。

顺便说一句,我没有在 Android 上测试过这个。我在 JDK 8.

上测试过它

就是说,我永远不会编写为 index >= str.length() 调用 str.indexOf(subStr,index) 的代码,因为在这种情况下我不希望在 str 中找到 subStr (不管 subStr 是否为空)。

我可能永远也不会将空的 String 传递给 indexOf,因为它看起来毫无意义。

在java8中,这段代码:

    String s="abcdefg";
    System.out.println(s.indexOf(""));
    System.out.println(s.indexOf("",3));
    System.out.println(s.indexOf("",18);

输出:

0
3
7

其中7s的长度。

虽然 java 文档 (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#indexOf-java.lang.String-int-) 说:

public int indexOf(String str, int fromIndex)

Returns the index within this string of the first occurrence of the specified substring, starting at the specified index.

The returned index is the smallest value k for which:

 k >= fromIndex  && this.startsWith(str, k)

If no such value of k exists, then -1 is returned.

所以我认为 java8 存在文档错误。因为我不知道你的 java 版本 old version for android,所以无法判断情况。