簡體   English   中英

string []與許多字符串中的Java內存使用

[英]Java memory use in string[] vs many strings

從內存使用的角度來看,誰能告訴我哪個更好,一個可以容納100個字符串或100個字符串的字符串數組(string [])。

我想知道當內存問題很關鍵時最好的方法是什么。

這取決於您正在談論的是哪種內存,以及您的意思是100字符串不在數組中。

讓我們從我們可以肯定地說的話開始。

  1. 如果我們假設以相同的方式創建字符串,則在兩種情況下,字符串的實際表示都將占用相同數量的堆空間。

  2. 100個字符串本身可能比具有100個元素的String[]或100個單獨的String變量占用更多數量級的空間。

不同之處在於我們如何保留對字符串的引用。

  • 如果它們保存在String[] ,則數組對象將為數組元素使用100個堆字,並為數組頭和填充使用3或4個堆字。

  • 如果將它們作為對象的實例字段保存,則這些字段需要100個堆字。 (如果沒有另外說明,可能還要加上對象的標頭+填充。這將是2或3個堆字。)

  • 如果將它們作為靜態字段保存,則需要100個堆字。 (加上隱藏的“靜態”對象的標頭+填充...,如果沒有另外說明的話。)

  • 如果將它們作為局部變量保存,則不需要堆空間。 而是引用將占用100個字的堆棧空間。


我想知道當內存問題很嚴重時的連擊方法是什么。

如您所見,總體差異很小,並且可能太小而無明顯意義。

並且在實踐中,您還需要考慮使用數組與使用100個單獨變量的代碼大小差異。 這將取決於應用程序如何使用字符串。 確實,代碼大小差異很容易淹沒上面的差異。

我的建議是不要打擾這種思路。 使用任何一種表示形式都會為您提供最易讀和可維護的代碼。 即使需要代表數百萬個單獨的字符串組,相差1或2個機器字也不大可能產生顯着差異。

Java對象有一個8字節的標頭,在一維數組的情況下,要適應數組長度有4字節的開銷。

例如,如果創建7個字符串,則對象使用7 * 8字節= 56字節的開銷。 如果將它們容納在一維數組中,則將為數組對象增加8個字節+為數組長度增加4個字節,因此將有56個字節+ 12個字節= 78個字節的開銷。

在多維數組的情況下,在Java中它們是一組數組,因此多維數組的每一行都有一個對象的開銷。

String[]使用稍多存儲器,具體地說,涉及創建一個數組引用length屬性。 但是,我們談論的只是很小的差異,我建議您使用任何一種更易於閱讀的解決方案(我認為是數組)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM