为什么java中的String类有char[] value
,int offset
和int count
字段。他们的目的是什么,他们完成了什么任务?
2 回答
该char[]
数组包含组成该字符串的字符数组。
偏移量和计数用于String.substring()
操作。当您获取字符串的子字符串时,结果String
引用原始字符数组,但存储关联的偏移量和长度(这称为享元模式,是一种常用的节省内存的技术)
例如String.substring("ABCDEF", 1, 2);
将引用原始数组,A,B,C,D,E,F
但设置offset
为 1 和length
1(因为该substring
方法使用开始和结束索引)。请注意,您可以轻松地做到这一点,因为字符数组是不可变的。你不能改变它。
注意:这最近发生了变化(我相信是 7u6),并且在最近的版本中不再适用。我怀疑这是由于意识到这种优化并没有真正使用太多。
它们允许来回传递一个数组作为主要对数组的一部分感兴趣的例程的支持。这使得人们不必担心构建大量的小数组,避免了与特定操作的对象构建相关的成本。
例如,可能使用数组作为输入缓冲区,但随后需要额外的数组来处理该缓冲区中的分块字符,使用数组、偏移量和计数这三个参数,您可以“模拟”从中间读取缓冲区无需创建新的(辅助)数组。
这很重要,因为虽然您可能合理地希望一个数组(Java 中的一个对象)来保存输入字符,但您可能不想分配和垃圾收集数千个数组(并将字符复制到其中)来传递数据变成只需要一个单词的东西,由空格分隔(嘿,这只是一个例子)。