2012-09-16 2 views
5

Se scrivo questo in Java:Sono necessari 3 byte in Java? quando: String s = "abc"; Java

String s = "abc"; 

Vuol s occupano solo 3 byte nella memoria?
Se vero, come JVM trova la fine dell'oggetto String?
Questo richiede più byte in memoria?

+2

Leggere l'origine per la classe 'String'. – SLaks

+0

Se si legge l'origine per la classe String, si vedrà che memorizza la lunghezza che è il modo in cui conosce la lunghezza della stringa. BTW "abc" utilizza circa 48 byte di memoria. –

risposta

7

Ci vuole più di 3 byte, continuate a leggere per una spiegazione completa da this page

Per ragioni che esploreremo in basso, l'utilizzo della memoria minima di una stringa Java (nel Hotspot Java 6 VM) è generalmente come segue:

Minimum String memory usage (bytes) = 8 * (int) ((((no chars) * 2) + 45)/8) 

o, per dirla in un altro modo:

  • moltiplicare il numero di Chara circoli della Stringa per due;
  • aggiungi 38;
  • se il risultato non è un multiplo di 8, arrotondato al multiplo successivo di 8;
  • il risultato è in genere il numero minimo di byte occupati nello heap dalla stringa.

This page dallo stesso sito Web coordinate anche i modi in cui è possibile risparmiare memoria utilizzando classi diverse di String

+0

aggiungi 38? o aggiungi 45? – Al2O3

+1

Aggiungi 38. Il 45 deve arrotondare per eccesso anziché per difetto. –

1

String Minimo utilizzo della memoria (byte) = 8 * (int) ((((num di chars) * 2) + 45)/8)

+0

in teoria potrebbe essere inferiore a quello ... se si prendono in considerazione le stringhe che condividono i backing array. –

+0

Questo è qualcos'altro, OP sta chiedendo informazioni sull'utilizzo della memoria e una singola stringa. – awm

2

Risposta breve: no, non da un punto lungo. Le stringhe JVM sono famose per essere piuttosto pesanti; l'oggetto contiene non solo un puntatore all'array di caratteri ma anche la sua lunghezza. E la memoria interna utilizza i codepoint UTF-16, quindi la tua domanda avrebbe potuto essere "ci vogliono 6 byte?" :-)

Un riferimento tecnico alla JVM fornirà la dimensione esatta degli oggetti stringa. È inoltre possibile trovare alcuni post del blog interessanti such as this one e articoli tecnici.

C'è molto di più nella domanda delle dimensioni esatte degli oggetti stringa. Possiamo entrare nella compressione di puntatori di oggetti, internamento di stringhe, ecc. C'è anche il fatto che, dal momento che le stringhe sono immutabili, spesso abbiamo la condivisione della memoria delle stringhe, come accade quando chiamate substring per esempio.

Tuttavia, ciò che è sempre vero è: è più di 3 byte.