So che una stringa C abc
sarebbe internamente abc\0
in C, è lo stesso caso con Java?Come viene rappresentata una stringa in Java internamente?
risposta
No, le stringhe C sono una matrice di caratteri e pertanto non è associata alcuna lunghezza. L'effetto collaterale di questa decisione è che per determinare la lunghezza di una stringa, si deve scorrere attraverso di essa per trovare lo \0
, che non è così efficiente da portare la lunghezza intorno.
Le stringhe Java hanno un array di caratteri per i caratteri e hanno una lunghezza di offset e una lunghezza di stringa. Ciò significa che determinare la lunghezza di una stringa è piuttosto efficiente.
Stringa in linguaggio C è una matrice di tipo char dove come in Java è una classe e rappresenta la raccolta di unicode chars.
No, non è lo stesso in Java. Non esiste un terminatore nullo. Le stringhe Java sono oggetti, non punti verso matrici di caratteri. Mantiene la lunghezza insieme ai caratteri Unicode, quindi non è necessario cercare un terminatore null.
Non devi chiedere qui: guarda il codice sorgente di String.java nel file src.zip fornito con JDK. Ecco l'inizio di esso:
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 fonte non si trova mai – alex
Si noti che UTF-16 viene utilizzato (o una minima variazione di esso?) Per 'valore []'. Non tutti i caratteri Unicode possono essere inseriti in un singolo 'char'. –
Inoltre, solo perché c'è un valore '[]' (e una 'lunghezza') * non * significa che non esiste un terminatore null aggiuntivo (ok, non c'è nella JVM canonica). Ad esempio, il [BCL - aka .NET/C# - ha * entrambi *] (http://stackoverflow.com/questions/6293457/why-are-c-net-strings-length-prefixed-and-null -terminated), sebbene il terminatore non sia mai esposto direttamente al codice gestito. (D'altra parte, a causa di ciò, il BCL non può creare una "vista" di una stringa in un'altra come in 'String.substring' fa in Java.) –
No. terminatori Null sono utilizzati in C perché è più facile che passare intorno ad un puntatore e una dimensione. In Java, la dimensione è sempre nota e quindi un terminatore null non è necessario. Inoltre, non ci sono caratteri di terminazione in Java (inserire un \0
farebbe parte della stringa letterale).
Le stringhe Java non hanno terminazioni Null come le stringhe C. Questo perché Java memorizza le lunghezze delle stringhe. È possibile recuperare la lunghezza con String.length()
.
Classe String
implementata in Java. Vedere OpenJDK implementation per un esempio.
L'OpenJDK 7 String
classe porta una matrice di tipo char[]
tenere la stringa stessa, così come un offset (risposta a prima posizione usato al char[]
), la lunghezza della stringa, e il codice hash della stringa .
Ha anche due campi statici, un ID versione per scopi di serializzazione e uno ObjectStreamField[]
a causa di un involucro speciale rispetto al flusso di uscita della serializzazione (almeno in OpenJDK 7).
Il campo 'ObjectStreamField [] serialPersistentField' è un' statico'. Un 'String' non" contiene "uno. Lo stesso vale per il campo 'serialVersionUID'. In realtà, un'istanza 'String' ha 4 campi. –
Hai ragione; Ho reso la risposta più specifica per abbinare. –
Ho pensato che il campo offset fosse abbandonato prima di JDK7, probabilmente perché gli implementatori hanno visto che se 'million' è una stringa di milioni di caratteri, avendo' million.substr (10,3) 'può contenere un riferimento a un backing store di milioni di caratteri essere molto dispendioso IMHO, avrebbero dovuto progettare 'substr' per creare un nuovo backing store quando si utilizzava meno della metà di quello vecchio, ma altrimenti si avrebbe un offset in quello vecchio. Ciò limiterebbe l'utilizzo della memoria nel caso peggiore solo il 2x ottimale, facilitando nel contempo alcuni schemi di utilizzo di uso comune. – supercat
Per quanto ne so, in java String è archiviato come oggetto nella sezione heap come sottoclasse di Object. Non è necessario usare '\ 0' per specificare solo caratteri o String.
- 1. Come viene definito (,) internamente?
- 2. Come viene rappresentata l'ereditarietà in un diagramma di sequenza?
- 3. Come la serializzazione java funziona internamente?
- 4. Come inizializzare una stringa in java?
- 5. Come si converte una stringa in una stringa letterale Java?
- 6. Come funziona l'operatore di arrow internamente in java 8?
- 7. In che modo unicode è rappresentato internamente in Python?
- 8. Come viene implementata la classe StringBuilder? Crea internamente nuovi oggetti stringa ogni volta che aggiungiamo?
- 9. In che modo LinkedList funziona internamente in Java?
- 10. conteggio viene eseguito in una stringa
- 11. Come funziona lo stringstream internamente?
- 12. albero binario rappresentata utilizzando matrice
- 13. Come funziona conda internamente?
- 14. Come stampare \ n in una stringa in java
- 15. Come funziona printf internamente?
- 16. Come viene implementato il metodo di stringa # intern() di Java?
- 17. Come posso mappare una stringa a una funzione in Java?
- 18. Come funziona Firebug internamente?
- 19. Come provare ... finalmente funziona internamente
- 20. Come convertire stringa esadecimale in stringa java
- 21. Come lanciare una stringa a un URL in java?
- 22. È possibile eseguire una ricerca rappresentata in SharePoint senza fornire una password?
- 23. Reindirizzamento stdout a una stringa in Java
- 24. Bash: verifica se una stringa è "maggiore" di un'altra - come funziona internamente?
- 25. Estratto da una stringa in Java
- 26. In Java, come viene raccolta una matrice di oggetti?
- 27. Incollare una stringa Java multilinea in Eclipse
- 28. Come cercare una stringa in un'altra stringa?
- 29. Come funziona PHP PDO internamente?
- 30. Come sostituire un carattere in una stringa in Java?
uh ... "sedie"? – buruzaemon
@buruzaemon: sai che anche i personaggi meritano un posto dove stare, giusto? – alex
+1 per la tua visione umana su 'char's e dove possono riposare un po ', @alex – buruzaemon