start - string string java
¿Por qué las cadenas comienzan con un "" en Java? (8)
"" es una cadena vacía que no contiene caracteres. No hay un "carácter vacío", a menos que te refieras a un espacio o al carácter nulo, ninguno de los cuales son cadenas vacías.
Puede pensar que una cadena comienza con un número infinito de cadenas vacías, al igual que puede pensar que un número comienza con un número infinito de ceros a la izquierda sin ningún cambio en el significado.
1 = ...00001
"foo" = ... + "" + "" + "" + "foo"
Las cadenas también terminan con un número infinito de cadenas vacías (al igual que los números decimales con ceros):
1 = 001.000000...
"foo" = "foo" + "" + "" + "" + ...
Posible duplicado:
¿Por qué "abcd" .StartsWith ("") devuelve true?
Durante la depuración a través de algún código, encontré que una parte particular de mi validación estaba usando el método .startsWith()
en la clase String para verificar si una String comenzó con un carácter en blanco
Teniendo en cuenta lo siguiente:
public static void main(String args[])
{
String s = "Hello";
if (s.startsWith(""))
{
System.out.println("It does");
}
}
Se imprime lo It does
Mi pregunta es, ¿por qué las cadenas comienzan con un carácter en blanco? Supongo que bajo el capó Las cuerdas son esencialmente matrices de caracteres, pero en este caso pensé que el primer carácter sería H
¿Alguien puede explicar por favor?
"Hello" comienza con "" y también comienza con "H" y también comienza con "He" y también comparte con "Hel" ... ¿ves?
La cadena vacía ( ""
) básicamente "satisface" todas las cadenas. En tu ejemplo, las llamadas java.
s.startsWith("");
a
s.startsWith("", 0);
que esencialmente sigue el principio de que "un elemento vacío (cadena) satisface su restricción (su frase de cadena)".
De 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;
}
Para las personas que han tomado la teoría de autómatas, esto tiene sentido porque la cadena vacía ε es una subcadena de cualquier cadena y también es el elemento de identidad de concatenación, es decir:
for all strings x, ε + x = x, and x + ε = x
Así que sí, cada cadena "startWith" la cadena vacía. También tenga en cuenta (como muchos otros lo dijeron), la cadena vacía es diferente de un carácter en blanco o nulo.
Parece que hay un malentendido en su código. Su declaración s.startsWith("")
comprueba si la cadena comienza con una cadena vacía (y no un carácter en blanco). Puede ser una elección de implementación extraña, de todos modos, es como es: todas las cadenas dirán que comienzan con una cadena vacía.
También note que un carácter en blanco será la " "
cadena, a diferencia de su cadena vacía ""
.
Que "" no está en blanco, es una cadena vacía. Supongo que la API está haciendo la pregunta es esta una subcadena de eso. Y la cadena vacía de longitud cero es una subcadena de todo.
Un espacio en blanco es (""), que es diferente de una cadena vacía (""). Un espacio en blanco es un carácter, la cadena vacía es la ausencia de cualquier carácter.
Una cadena vacía no es un carácter en blanco. Asumiendo tu pregunta con una cadena vacía, supongo que decidieron dejarla así, pero parece extraño. Podrían haber comprobado la longitud, pero no lo hicieron.