2011-12-16 10 views

risposta

7

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.

Source.

+2

uh ... "sedie"? – buruzaemon

+4

@buruzaemon: sai che anche i personaggi meritano un posto dove stare, giusto? – alex

+1

+1 per la tua visione umana su 'char's e dove possono riposare un po ', @alex – buruzaemon

2

Stringa in linguaggio C è una matrice di tipo char dove come in Java è una classe e rappresenta la raccolta di unicode chars.

10

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; 
} 
+0

+1 la fonte non si trova mai – alex

+0

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'. –

+0

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.) –

2

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).

2

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().

1

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).

+0

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. –

+0

Hai ragione; Ho reso la risposta più specifica per abbinare. –

+0

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

0

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.

Problemi correlati