为啥字符串在Java中以“”开头? [复制]

Posted

技术标签:

【中文标题】为啥字符串在Java中以“”开头? [复制]【英文标题】:Why do Strings start with a "" in Java? [duplicate]为什么字符串在Java中以“”开头? [复制] 【发布时间】:2011-04-21 20:06:21 【问题描述】:

可能重复:Why does “abcd”.StartsWith(“”) return true?

在通过一些代码进行调试时,我发现我的验证的一个特定部分是使用 String 类上的 .startsWith() 方法来检查字符串是否以空白字符开头

考虑以下几点:

public static void main(String args[])


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


它打印出It does

我的问题是,为什么字符串以空白字符开头?我假设在引擎盖下字符串本质上是字符数组,但在这种情况下,我会认为第一个字符是H

谁能解释一下?

【问题讨论】:

什么是“空白”字符? @PP - 不要挑剔。 1) 很多 SO 人的第一语言不是英语。 2) 空白是可接受的空格替代方案。 3)你知道他/他们的意思......真的。 @Stephen C 绝对不是。这与“英语”无关。这是关于常见的 IT 角色名称。空白没有很好的定义。空格、制表符、回车、换行都是定义明确的空格名称。空白 - 是一般性。 类似于Why does "abcd".StartsWith("") return true?、IndexOf method returns 0 when it should had return -1 in C# / Java和Why does IQueryable.All() return true on an empty collection? 重复***.com/questions/145509/… 【参考方案1】:

"" 是一个不包含字符的空字符串。没有“空字符”,除非您指的是空格或空字符,它们都不是空字符串。

您可以将字符串视为以无限数量的空字符串开头,就像您可以将数字视为以无限数量的前导零开头而不改变其含义一样。

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

字符串也以无限数量的空字符串结尾(就像带零的十进制数一样):

1 = 001.000000...
"foo" = "foo" + "" + "" + "" + ...

【讨论】:

为了使类比完全一致,您应该使用 1.0,这样在末尾添加零也没有效果。 :) @Justin,我相信卡梅伦更多地指的是一个抽象概念(即在数学中 1 = ...0000001 = 1.00000000 ...)等等。一个提示是 "foo" = "foo" 这在 Java 中是非法的,例如 :) 他实际上也会使用 "foo" == "foo" ... @Justin:是的,在编程语言中,在整数前面加上0 通常意味着该数字以八进制(而不是十进制)表示。但是,我使用数字作为类比,而不是表达正确的 Java 代码;-) 感谢您指出这一点!同样,= 在 Java 中也不能用于比较。 前导零没有任何区别,但我的老化学教授对尾随零做了很多事情......称它们为有效数字或其他类似的愚蠢的东西:) 老实说,关于有效数字的争论无论如何都与数学无关。您的有效数字基于测量的精度,这不是大多数数学中使用的概念。数学中的标准观点是 1 = 1.0 = 1.00 等等。【参考方案2】:

您的代码似乎存在误解。您的语句 s.startsWith("") 检查字符串是否以空字符串开头(并且 不是 空白字符)。无论如何,这可能是一个奇怪的实现选择:所有字符串都会说你以空字符串开头。

还要注意一个空白字符将是 " " 字符串,而不是您的空字符串 ""

【讨论】:

【参考方案3】:

“Hello”以“”开头,它也以“H”开头,它也以“He”开头,它也以“Hel”开头......你看到了吗?

【讨论】:

【参考方案4】:

那个 "" 不是一个空白,它是一个空字符串。我猜API在问这个问题是它的一个子字符串。而零长度的空字符串是所有内容的子字符串。

【讨论】:

【参考方案5】:

空字符串 ("") 基本上“满足”每个字符串。在您的示例中,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;
     

【讨论】:

这是我最喜欢的答案。 +1。它基本上说字符串以空字符串“开始”,因为String.startsWith 是这样编码的。上面的哲学答案都没有证明以空字符串开头的字符串是 Java 中经过深思熟虑的设计选择,还是 String.startsWith 实现的巧合后果。在此之前,此讨论只能是学术性的。【参考方案6】:

对于学过自动机理论的人来说,这是有道理的,因为空字符串 ε 是任何字符串的子字符串,也是连接标识元素,即:

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

所以是的,每个字符串“startWith”都是空字符串。另请注意(正如许多其他人所说),空字符串与空白或空字符不同。

【讨论】:

【参考方案7】:

空格是 (" "),它不同于空字符串 ("")。空格是一个字符,空字符串是没有任何字符。

【讨论】:

很高兴听到 Java 人称空格为“空白”。请问什么是标签,它也是“空白”吗? @PP:我用的是你的术语,可能是指空格和制表符更准确。【参考方案8】:

空字符串不是空白字符。假设您的问题是空字符串,我猜他们决定保留这种方式,但看起来确实很奇怪。他们本可以检查长度,但没有。

【讨论】:

以上是关于为啥字符串在Java中以“”开头? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在正则表达式中以某种方式忽略子后的第一个字符? [复制]

如何在字符 ASCII 字符串中以数字形式转换 java id? [复制]

为啥你可以在 C 中以 $ 开头的变量名?

急!如何批量删除数据库中以特定字符开头和结尾的字符串

第26讲: Python中以is开头的字符串方法使用案例

为啥我必须在 Java 正则表达式中指定整个字符串? [复制]