Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java字符串实现中存在偏移量?_Java_String_Implementation - Fatal编程技术网

为什么Java字符串实现中存在偏移量?

为什么Java字符串实现中存在偏移量?,java,string,implementation,Java,String,Implementation,我一直在看实现,我不明白为什么会有补偿。我想这很重要 我正在学习Sedgewick教授的算法课程,我们现在讨论的是字符串。在讲座中,他简要地讨论了字符串实现,但他没有解释为什么会有偏移量(注意,如果讲座不是在线的,我肯定会问) 似乎当一个人在实现中创建一个字符串时,它会得到一个偏移量,而我似乎无法理解为什么需要一个。即使对于子字符串,我也不太明白为什么会有偏移量。例如,显然,如果您创建一个字符串“David”,它实际上是['X','X','D','a','v','i','D','X'],或者类似

我一直在看实现,我不明白为什么会有补偿。我想这很重要

我正在学习Sedgewick教授的算法课程,我们现在讨论的是字符串。在讲座中,他简要地讨论了字符串实现,但他没有解释为什么会有偏移量(注意,如果讲座不是在线的,我肯定会问)


似乎当一个人在实现中创建一个字符串时,它会得到一个偏移量,而我似乎无法理解为什么需要一个。即使对于子字符串,我也不太明白为什么会有偏移量。例如,显然,如果您创建一个字符串“David”,它实际上是
['X','X','D','a','v','i','D','X']
,或者类似的东西,它被
'X'
s抵消。这是为什么?

当字符串需要从另一个较长的字符串派生时,类似于substring(),这可能很有用

在这种情况下,在调整偏移量和长度的同时,可以使用相同的(不可变)后备阵列来节省内存并优化性能


JDK7中不再是这种情况。

偏移通常作为优化出现。例如,在与字符数组相关的项中,可以多次使用同一字符数组从数组构造多个字符串。这是因为您将使用具有不同偏移和长度的相同阵列


这是一个非常有效的优化,因为它避免了仅为了使您希望开始使用的字符的索引为零而构建新字符数组的需要。例如,在读入一个字节块(可能来自套接字)后,您可以将其分块成字符串大小的消息,而不必进行不必要的字节复制。

您正在查看哪个Java版本?Oracle的JDK 7实现不再使用偏移量字段。在Java 7 update 4之前,字符串可能指向另一个字符串的一部分,因此它需要知道该部分的起始位置。问得好!我一直认为偏移的原因是,您可以执行
split
substring
等操作,而无需复制备份数组。但我没有证据表明,这是决定以这种方式实施该计划的实际理由。我已为问题添加了更多内容@DavidWallace,我不确定抵消会有什么帮助。我的意思是,如果你做
“David问了一个好问题”。split(“”)
,则生成的
“David”、“asked”、“a”、“good”
“question”
都可以与原始
字符串共享相同的字符数组,但偏移量和长度不同,因此它们显示数组的不同部分。这样,字符本身就不需要被复制。那么本质上,你是说如果我有例如
['X','X','D','a','v','I','D','X']
,我可以使用完全相同的数组,但是偏移量会改变,所以每当我执行任何操作时,它都会在这个数组的子集上执行它?例如,如果偏移量是2,而我想要
'vid'
,那么偏移量将变成4,基于此,我可以在保留空间的同时进行所有必要的计算?@David是的,准确地说。这就是为什么子字符串可以如此容易地计算:它使用具有不同偏移量的支持数组;当使用字符串时(例如在
System.out.println()
中),计算结果会发生变化。@David实际上,我误读了你的评论。这并不完全正确。当创建字符串时(假设没有优化技巧),它将是
['D','a','v','i','D']
。当您开始调用子字符串、拆分等时,您将看到使用了此支持数组的部分内容。