在Oracle的JDK中,a String
有四个实例级字段:
这意味着除了字符数组本身之外,每个String
引入一个额外的对象引用(String
自身)和三个整数.(偏移量和字符数允许在String
通过这些String#substring()
方法生成的实例之间共享字符数组,这是其他一些Java库实现者所避免的设计选择.)除了额外的存储成本之外,还有一个更高级别的访问间接,更不用说检查String
其角色阵列的边界了.
如果你能够分配和使用基本字符数组,那么就有空间可以保存.在Java中这样做当然不是惯用的; 有理由提出明智的评论来证明这一选择的合理性,最好是提出分析差异的证据.
在这个例子中,你已经提到,这是因为只有一个有单个字符数组被分配用于整个循环.它反复读入同一个数组,并在适当的位置处理它.
将其与使用readLine
哪个需要在每次迭代中创建新 String
实例进行比较.每个String
实例将包含一些int
字段和对char[]
包含实际数据的引用- 因此每次迭代需要两个新实例.
我通常认为差异是微不足道的(与一个体面的GC非常有效地丢弃未使用的"年轻"对象)相比,读取数据所涉及的IO - 假设它来自磁盘 - 但我相信这是作者尝试的重点制作.
归档时间: |
|
查看次数: |
4700 次 |
最近记录: |