2011-12-16 12 views

Respuesta

7

No, las cadenas C son una matriz de caracteres y, por lo tanto, no hay ninguna longitud asociada a ellas. El efecto secundario de esta decisión es que para determinar la longitud de una cadena, debe recorrerla para encontrar la \0, que no es tan eficiente para transportar la longitud.

Las cadenas Java tienen una matriz char para sus caracteres y tienen una longitud de desplazamiento y una longitud de cadena. Esto significa que determinar la longitud de una cuerda es bastante eficiente.

Source.

+2

uh ... "sillas"? – buruzaemon

+4

@buruzaemon: ¿Sabes que incluso los personajes merecen un lugar donde sentarse, verdad? – alex

+1

+1 para su visión humana en 'char's y donde pueden descansar un rato, @alex – buruzaemon

2

La cadena en lenguaje C es una matriz de tipo char donde, como en Java, es una clase y representa la colección de unicode chars.

10

No, no es lo mismo en Java. No hay un terminador nulo Las cadenas Java son objetos, no puntos, a matrices de caracteres. Mantiene la longitud junto con los caracteres Unicode, por lo que no hay necesidad de buscar un terminador nulo.

No tiene que preguntar aquí: consulte la fuente de String.java en src.zip que se envía con su JDK. Aquí está el comienzo de la misma: terminadores nulos

public final class String 
    implements java.io.Serializable, Comparable<String>, CharSequence 
{ 
    /** The value is used for character storage. */ 
    private final char value[]; 

    /** The offset is the first index of the storage that is used. */ 
    private final int offset; 

    /** The count is the number of characters in the String. */ 
    private final int count; 

    /** Cache the hash code for the string */ 
    private int hash; // Default to 0 

    /** use serialVersionUID from JDK 1.0.2 for interoperability */ 
    private static final long serialVersionUID = -6849794470754667710L; 
} 
+0

+1 la fuente nunca miente – alex

+0

Debe tenerse en cuenta que se usa UTF-16 (o una variación muy leve de ella?) Para 'value []'. No todos los caracteres Unicode pueden rellenarse en un solo 'char'. –

+0

Además, el hecho de que haya un 'valor []' (y una 'longitud') * no * significa que no hay un terminador nulo adicional (está bien, no existe en la JVM canónica). Por ejemplo, el [BCL - también conocido como .NET/C# - tiene * ambos *] (http://stackoverflow.com/questions/6293457/why-are-c-net-strings-length-prefixed-and-null -terminated), aunque el terminador nunca se expone directamente al código administrado. (Por otro lado, debido a esto, el BCL no puede crear una "vista" de una cadena en otra como lo hace 'String.substring' en Java.) –

2

No. Se utilizan en C porque es más fácil de lo que pasa alrededor de un puntero y un tamaño. En Java, el tamaño siempre se conoce y, por lo tanto, no es necesario un terminador nulo. Además, no hay caracteres de terminación en Java (poner en un \0 sería parte de la cadena literal).

2

Las cadenas Java no tienen terminación nula como las cadenas C. Esto se debe a que Java almacena las longitudes de las cadenas. Puede recuperar la longitud con String.length().

1

La clase String se implementa en Java. Vea OpenJDK's implementation para un ejemplo.

El OpenJDK 7 String clase lleva una matriz de tipo char[] para contener la cadena en sí, así como un desplazamiento (contando la primera posición utilizada en el char[]), la longitud de la cadena, y el código hash de la cadena .

También tiene dos campos estáticos, una ID de versión para fines de serialización y un ObjectStreamField[] debido a una carcasa especial con respecto a la secuencia de salida de serialización (al menos en OpenJDK 7).

+0

El campo 'ObjectStreamField [] serialPersistentFields' es un' static'. Un 'String' no" contiene "uno. Lo mismo para el campo 'serialVersionUID'. En realidad, una instancia de 'String' tiene 4 campos. –

+0

Tienes razón; He hecho la respuesta más específica para que coincida. –

+0

Pensé que el campo de desplazamiento se abandonó antes de JDK7, probablemente porque los implementadores vieron que si 'million' es una cadena de un millón de caracteres, tener' million.substr (10,3) 'mantener una referencia a una tienda de respaldo de un millón de caracteres podría ser muy derrochador En mi humilde opinión, deberían haber diseñado 'substr' para crear una nueva tienda de respaldo cuando se usa menos de la mitad de la antigua, pero de lo contrario tomar una compensación en la anterior. Eso limitaría el uso de memoria en el peor de los casos, solo el doble de lo óptimo, a la vez que facilitaría algunos patrones de uso comúnmente útiles. – supercat

0

Por lo que sé, en java String se almacena como un objeto en la sección de montón como una subclase de Object. No es necesario usar '\ 0' para especificar solo caracteres o Cadena.

Cuestiones relacionadas