2012-09-16 4 views
5

Jeśli piszę to w Javie:Czy s zajmuje 3 bajty w Javie? when: String s = "abc"; Java

String s = "abc"; 

Czy y zajmują tylko 3 bajty w pamięci?
Jeśli true, w jaki sposób JVM znajduje koniec obiektu String?
Czy zajmuje to więcej bajtów w pamięci?

+2

Przeczytaj źródło dla klasy "String". – SLaks

+0

Jeśli czytasz źródło dla klasy String, zobaczysz, że przechowuje długość, czyli jak wie, jak długi jest ciąg. BTW "abc" wykorzystuje około 48 bajtów pamięci. –

Odpowiedz

7

To trwa dłużej niż 3 bajty, zapoznanie się z pełnym wyjaśnieniem this page

Ze względów będziemy badać poniżej minimum zużycie pamięci z Java String (w Hotspot Java 6 VM) jest ogólnie w następujący sposób:

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

Albo, innymi słowy:

  • pomnożyć liczbę chara coty ciągu przez dwa;
  • dodaj 38;
  • jeśli wynik nie jest wielokrotnością liczby 8, zaokrąglaj do następnej wielokrotności liczby 8;
  • Wynik jest zwykle minimalną liczbą bajtów pobranych na stercie przez ciąg.

This page z tej samej stronie także szczegóły, w jaki sposób można zaoszczędzić pamięć za pomocą klas innych niż String

+0

dodać 38? lub dodać 45? – Al2O3

+1

Dodaj 38. 45 ma zaokrąglić w górę zamiast w dół. –

1

wykorzystanie pamięci Minimum String (bajtów) = 8 * (int) ((((NUM znaki) * 2) + 45)/8)

+0

teoretycznie może być mniej niż ... jeśli weźmiesz pod uwagę łańcuchy, które mają wspólne tablice. –

+0

To coś innego, OP pyta o użycie pamięci i pojedynczy ciąg znaków. – awm

2

Krótka odpowiedź: nie, bez długiego strzału. Struny JVM są dobrze znane z tego, że są dość ciężkie; obiekt zawiera nie tylko wskaźnik do tablicy znaków, ale także jej długość. Pamięć wewnętrzna korzysta z codepunktów UTF-16, więc pytanie może być "czy zajmuje to 6 bajtów?" :-)

Techniczne odniesienie do JVM da dokładny rozmiar obiektów typu string. Możesz także znaleźć interesujące posty na blogu: such as this one oraz artykuły techniczne.

Jest o wiele więcej do pytania o dokładny rozmiar obiektów ciąg. Możemy uzyskać kompresję wskaźników obiektów, stringów itp. Istnieje również fakt, że ponieważ ciągi znaków są niezmienne, często dzielimy się pamięcią ciągów, tak jak dzieje się to np. Po wywołaniu substring.

Jednak zawsze jest prawdą: jest to więcej niż 3 bajty.