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