为什么char []比String更好? - Java

nam*_*ked 7 java string character

参考链接:文件IO调优,最后一节标题为"进一步调整",作者建议使用char []来避免为n文件中的行生成String对象,我需要了解它是怎么做的

char[] arr = new char{'a','u','t','h', 'o', 'r'}

与...不同

String s = "author"

在内存消耗或任何其他性能因素方面?String对象是否内部存储为字符数组?我觉得很傻,因为我以前从没想过这个.:-)

seh*_*seh 7

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

  • 一个字符数组
  • 积分偏移量
  • 一个完整的字符数
  • 一个完整的哈希值

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

如果你能够分配和使用基本字符数组,那么就有空间可以保存.在Java中这样做当然不是惯用的; 有理由提出明智的评论来证明这一选择的合理性,最好是提出分析差异的证据.


Jon*_*eet 6

在这个例子中,你已经提到,这是因为只有一个有单个字符数组被分配用于整个循环.它反复读入同一个数组,并在适当的位置处理它.

将其与使用readLine哪个需要在每次迭代中创建 String实例进行比较.每个String实例将包含一些int字段和对char[]包含实际数据的引用- 因此每次迭代需要两个新实例.

我通常认为差异是微不足道的(与一个体面的GC非常有效地丢弃未使用的"年轻"对象)相比,读取数据所涉及的IO - 假设它来自磁盘 - 但我相信这是作者尝试的重点制作.