哪个在内存方面有效:char []或String?

时间:2015-03-18 03:57:54

标签: java android arrays string

我正在开发一个Android应用程序。该应用程序的主要要求是它在内存方面应该是高效的。那么,我应该继续下一步呢?

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

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

3 个答案:

答案 0 :(得分:2)

在Oracle的JDK中,String有四个实例级字段:

  • 字符数组
  • 积分偏移量
  • 整数字符数
  • 整数散列值

这意味着每个String引入一个额外的对象引用(String本身),以及除字符数组本身之外的三个整数。 (偏移和字符计数允许在通过String #substring()方法生成的String实例之间共享字符数组,这是一些其他Java库实现者所避免的设计选择。)除了额外的存储成本之外,还有#39 ; s还有一个级别的访问间接,更不用说使用String保护其字符数组的边界检查。

字符串是不可变的。这意味着一旦你创建了字符串,如果另一个进程可以转储内存,那么除了反射之外你没办法在GC启动之前摆脱数据,这意味着浪费内存。

使用数组,您可以在完成数据后明确擦除数据:您可以使用您喜欢的任何内容覆盖数组。

因此,据我所知,char []在你的情况下的内存方面更好。

答案 1 :(得分:0)

String是class在java中,它包含char数组,如代码所示

private final char value[];

因此,每次创建String对象时,它都由char数组支持。 并且String类有三个不同的字段,因为它占用的内存比char数组多。

但是如果你看到用法,那么String比char数组更好,因为它是不可变的。你不必为String做任何内存管理。性能明智的char数组[]对于少数操作来说更快(如果你在大量数据上执行)。

答案 2 :(得分:0)

CString除了字符数组(或宽字符)外还包含字符串大小,分配的缓冲区大小和引用计数器(另外作为锁定标志)。包含字符数组的缓冲区可能比它包含的字符串大得多 - 它允许减少耗时的分配调用次数。此外,当CString设置为零大小时,它仍然包含两个wchar字符。

当然,当你将CString的大小与相应的C风格数组的大小进行比较时,数组会更小。但是,如果要像CString允许的那样广泛地操作字符串,最终将为字符串大小,缓冲区大小以及有时refcounter和/或guard标志定义自己的变量。实际上,您需要存储字符串大小以避免每次需要时调用strlen。如果允许缓冲区大于字符串长度,则需要单独存储缓冲区大小,并避免每次添加或删除字符串时调用reallocs。等等 - 您交易一些小规模的增加,以显着提高速度,安全性和功能性。

所以,答案取决于你要对字符串做什么。假设您想要一个字符串来存储您的类的名称以进行日志记录 - 那么C样式的字符串(const和static)就可以了。如果需要一个字符串来操作并广泛使用它与MFC或ATL相关的类,请使用CString族类型。如果你需要在"引擎中操纵字符串"应用程序中与其接口隔离的部分,可以转换为其他平台,使用std :: string或编写自己的字符串类型以满足您的特定需求(当您编写" glue&时,这非常有用) #34;放在接口和引擎之间的代码,否则最好使用std :: string。

P.S使用char []

比较C ++的字符串

Source