簡體   English   中英

就內存而言,哪種有效:char []或String?

[英]Which is efficient in terms of memory: char[] or String?

我正在開發一個Android應用程序。 該應用程序的主要要求是它在內存方面應該是高效的。 那么,我應該繼續進行哪些操作呢?

String batterylevel;
batterylevel = Float.toString(batteryPct);

要么

char batterylevel[];
batterylevel = Float.toString(batteryPct).toCharArray();

在Oracle的JDK中,字符串具有四個實例級字段:

  • 字符數組
  • 積分偏移
  • 整數字符數
  • 整數哈希值

這意味着每個String都會引入一個額外的對象引用(String本身),以及字符數組本身之外的三個整數。 (偏移量和字符計數允許在通過String#substring()方法生成的String實例之間共享字符數組,這是其他Java庫實現者避開的設計選擇。)除了額外的存儲成本外,還有一個訪問間接訪問的級別更高,更不用說String保護其字符數組的范圍檢查了。

字符串是不可變的。 這意味着一旦創建了字符串,如果另一個進程可以轉儲內存,則無法(除了反射)無法在GC啟動之前清除數據,這意味着浪費內存。

使用數組,您可以在使用完數據后顯式擦除數據:您可以使用任何喜歡的內容覆蓋數組。

就我所能斷定的而言,就您的情況而言,char []在內存方面更好。

字符串是java中的類,如代碼所示,它包裝了char數組

private final char value[];

因此,每次創建String對象時,它都由char數組支持。 而且String類具有三個不同的字段,因為它比char數組占用更多的內存。

但是如果您看到用法,則String比char數組要好,因為它是不可變的。 您不必對String進行任何內存管理。 性能明智的char array []對於少數操作(如果要對大量數據執行)則更快。

除了字符數組(或寬字符)之外,CString還包含字符串大小,分配的緩沖區大小和引用計數器(另外用作鎖定標志)。 包含char數組的緩沖區可能比其包含的字符串大得多-它可以減少耗時的分配調用次數。 另外,當CString設置為零大小時,它仍然包含兩個wchar字符。

自然地,當您將CString的大小與對應的C樣式數組的大小進行比較時,該數組會更小。 但是,如果您想像CString所允許的那樣廣泛地操作字符串,則最終將為字符串大小,緩沖區大小以及有時引用計數和/或保護標志定義自己的變量。 實際上,您需要存儲字符串大小,以避免每次需要時都調用strlen。 如果允許緩沖區大於字符串長度,則需要單獨存儲緩沖區大小,並且避免在每次添加或減去字符串時調用realloc。 依此類推-您可以通過增加一些小尺寸來提高速度,安全性和功能。

因此,答案取決於要對字符串進行的處理。 假設您想要一個字符串來存儲您的類的名稱以進行記錄-在那里可以使用C樣式的字符串(const和static)。 如果您需要一個字符串來操作並與MFC或ATL相關的類廣泛使用它,請使用CString系列類型。 如果您需要在應用程序的“引擎”部分中與它的界面隔離開來並可能轉換為其他平台的字符串,請使用std :: string或編寫自己的字符串類型來滿足您的特定需求(這可以是在編寫“膠水”代碼以放置在接口和引擎之間時非常有用,否則,最好使用std :: string。

PS比較C ++的字符串和char []

資源

暫無
暫無

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

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