Sé que una cadena C abc
sería internamente abc\0
en C, ¿es el mismo caso con Java?¿Cómo se representa una cadena en Java internamente?
Respuesta
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.
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.
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;
}
+1 la fuente nunca miente – alex
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'. –
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.) –
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).
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()
.
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).
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. –
Tienes razón; He hecho la respuesta más específica para que coincida. –
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
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.
- 1. cómo se representa la anotación java en java bytecode
- 2. Java: Convertir una cadena (que representa un IP) para InetAddress
- 3. ¿Cómo se define (?) Internamente?
- 4. ¿Cómo se representa "{{" en una plantilla django?
- 5. ¿Cómo funciona LinkedList internamente en Java?
- 6. ¿Cómo se implementa malloc() internamente?
- 7. ¿Cómo funciona stringstream internamente?
- 8. ¿cómo funciona fgets internamente?
- 9. analizar una cadena que representa una lista de tuplas
- 10. ¿Cómo se representa null en .NET
- 11. ¿Puede alguien confirmar cómo Microsoft Excel 2007 representa internamente los números?
- 12. ¿Cómo se implementa la referencia internamente?
- 13. En Java, ¿cómo se convierte una Cadena en un char o un char en una Cadena?
- 14. ¿Cómo se mantiene internamente el diccionario?
- 15. ¿Cómo se dibuja una cadena centrada verticalmente en Java?
- 16. ¿Cómo se puede validar una cadena en Java?
- 17. ¿Cómo analizo una cadena que representa una lista anidada en una lista real?
- 18. ¿Cómo implementa .Net CLR una "Interfaz" internamente?
- 19. ¿Cómo puedo analizar una cadena HTML en Java?
- 20. ¿Cómo se representa el audio con números?
- 21. ¿Cómo se representa una matriz de cadenas JSON?
- 22. Hash: ¿Cómo funciona internamente?
- 23. ¿Cuál representa nulo? undef o cadena vacía
- 24. ¿Cómo inicializas una cadena en Java?
- 25. ¿Cómo se almacenan internamente las referencias en C++?
- 26. ¿Cómo se representa un tipo de cadena localizada en Datos básicos?
- 27. ¿Cómo funciona LINQ internamente?
- 28. Cómo reemplazar caracteres en una cadena java?
- 29. ¿Cómo funciona Firebug internamente?
- 30. cómo funciona printf internamente.
uh ... "sillas"? – buruzaemon
@buruzaemon: ¿Sabes que incluso los personajes merecen un lugar donde sentarse, verdad? – alex
+1 para su visión humana en 'char's y donde pueden descansar un rato, @alex – buruzaemon