首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >就内存而言,哪个更有效: char[]还是String?

就内存而言,哪个更有效: char[]还是String?
EN

Stack Overflow用户
提问于 2015-03-18 11:57:54
回答 3查看 454关注 0票数 6

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

代码语言:javascript
复制
String batterylevel;
batterylevel = Float.toString(batteryPct);

代码语言:javascript
复制
char batterylevel[];
batterylevel = Float.toString(batteryPct).toCharArray();
EN

回答 3

Stack Overflow用户

发布于 2015-03-18 13:27:56

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

  • A character array

a

  • offset
  • An integral character count
  • An integral hash value

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

字符串是不可变的。这意味着一旦你创建了字符串,如果另一个进程可以转储内存,你就没有办法(除了反射)在GC开始之前删除数据,这意味着内存的浪费。

使用数组,您可以在处理完数据后显式地擦除数据:您可以用您喜欢的任何东西覆盖数组。

因此,就我所能得出的结论是,对于您的情况,char[]在内存方面更好。

票数 2
EN

Stack Overflow用户

发布于 2015-03-18 13:35:08

String是java中的类,它包装char数组,如您在代码中所见

代码语言:javascript
复制
private final char value[];

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

但是如果你看到用法,那么String比char数组更好,因为它是不可变的。你不需要对字符串进行任何内存管理。性能明智的char array[]对于较少的操作更快(如果您是在大数据上执行)。

票数 0
EN

Stack Overflow用户

发布于 2015-03-18 14:33:12

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

当然,当您将CString的大小与相应的C样式数组的大小进行比较时,数组会更小。但是,如果您希望尽可能广泛地操作CString允许的字符串,您最终将为字符串大小、缓冲区大小定义自己的变量,有时还会定义refcounter和/或防护标志。实际上,您需要存储字符串大小,以避免每次需要时都调用strlen。如果允许缓冲区大于字符串长度,则需要单独存储缓冲区大小,并避免每次在字符串中添加或减去时调用reallocs。以此类推--您可以牺牲一些小尺寸的增加来换取速度、安全性和功能性的显著提高。

所以,答案取决于你要对字符串做什么。假设您想要一个字符串来存储用于日志记录的类名--有一个C样式的字符串(const和static)就可以了。如果需要字符串来操作和广泛使用它与MFC或ATL相关的类,请使用CString系列类型。

P.S比较C++和char[]的字符串

Source

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29113883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档