20

重複の可能性:
「abcd」.StartsWith(“”)がtrueを返すのはなぜですか?

いくつかのコードをデバッグしているときに、検証の特定の部分が.startsWith()Stringクラスのメソッドを使用して、文字列が空白文字で始まっているかどうかを確認していることがわかりました。

次のことを考慮してください:

public static void main(String args[])
{

    String s = "Hello";
    if (s.startsWith(""))
    {
        System.out.println("It does");
    }

}

印刷しますIt does

私の質問は、なぜ文字列は空白文字で始まるのですか?内部的には文字列は本質的に文字配列であると思いますが、この場合、最初の文字はH

誰か説明してもらえますか?

4

8 に答える 8

40

「」は文字を含まない空の文字列です。スペースまたはヌル文字を意味しない限り、「空の文字」はありません。どちらも空の文字列ではありません。

文字列は、意味を変更せずに、無限の数の先行ゼロで始まる数と考えることができるのと同じように、無限の数の空の文字列で始まると考えることができます。

1 = ...00001
"foo" = ... + "" + "" + "" + "foo"

文字列も無限の数の空の文字列で終わります(ゼロのある10進数も同様です)。

1 = 001.000000...
"foo" = "foo" + "" + "" + "" + ...
于 2010-10-06T13:29:52.980 に答える
11

コードに誤解があるようです。ステートメントは、文字列が(空白文字ではなくs.startsWith(""))空の文字列で始まるかどうかをチェックします。とにかく、それは奇妙な実装の選択かもしれません、とにかく、それはそのままです:すべての文字列は、空の文字列で始まるとあなたに言います。

" "また、空の文字列ではなく、空白文字が文字列になることに注意してください""

于 2010-10-06T13:31:02.613 に答える
7

「こんにちは」は「」で始まり、「H」で始まり、「彼」で始まり、「ヘル」で始まります...わかりますか?

于 2010-10-06T14:05:55.743 に答える
5

その「」は空白ではなく、空の文字列です。APIが質問をしているのは、これがそのサブストリングだと思います。そして、長さがゼロの空の文字列は、すべてのサブ文字列です。

于 2010-10-06T13:30:35.827 に答える
4

空の文字列("")は、基本的にすべての文字列を「満たします」。あなたの例では、Javaは

s.startsWith(""); 

s.startsWith("", 0);

これは基本的に、「空の要素(文字列)がその制約(文字列文)を満たす」という原則に従います。

String.javaから

/**
     * Tests if the substring of this string beginning at the
     * specified index starts with the specified prefix.
     *
     * @param   prefix    the prefix.
     * @param   toffset   where to begin looking in this string.
     * @return  <code>true</code> if the character sequence represented by the
     *          argument is a prefix of the substring of this object starting
     *          at index <code>toffset</code>; <code>false</code> otherwise.
     *          The result is <code>false</code> if <code>toffset</code> is
     *          negative or greater than the length of this
     *          <code>String</code> object; otherwise the result is the same
     *          as the result of the expression
     *          <pre>
     *          this.substring(toffset).startsWith(prefix)
     *          </pre>
     */
    public boolean startsWith(String prefix, int toffset) {
    char ta[] = value;
    int to = offset + toffset;
    char pa[] = prefix.value;
    int po = prefix.offset;
    int pc = prefix.count;
    // Note: toffset might be near -1>>>1.
    if ((toffset < 0) || (toffset > count - pc)) {
        return false;
    }
    while (--pc >= 0) {
        if (ta[to++] != pa[po++]) {
            return false;
        }
    }
    return true;
    } 
于 2010-10-06T13:45:50.050 に答える
4

オートマトン理論を採用している人にとって、これは理にかなっています。なぜなら、空の文字列εは任意の文字列の部分文字列であり、連結単位元でもあるからです。

for all strings x, ε + x = x, and x + ε = x

そうです、すべての文字列は空の文字列を「startWith」します。また、(他の多くの人が言っているように)空の文字列は空白またはヌル文字とは異なることに注意してください。

于 2010-10-06T21:29:02.847 に答える
2

空白は( "")であり、空の文字列( "")とは異なります。空白スペースは文字であり、空の文字列は文字がないことです。

于 2010-10-06T13:31:32.397 に答える
0

空の文字列は空白文字ではありません。あなたの質問が空の文字列であると仮定すると、彼らはそれをそのままにしておくことに決めたと思いますが、それは奇妙に思えます。彼らは長さをチェックすることができたかもしれませんが、彼らはしませんでした。

于 2010-10-06T21:37:52.020 に答える