【发布时间】:2013-11-11 03:41:48
【问题描述】:
我一直在研究实现,但我不明白为什么会有偏移量。我认为这很重要。
我正在学习 Sedgewick 教授的算法课程,现在我们正在讨论字符串。在讲座中,他简要讨论了 String 的实现,但他没有解释为什么会有偏移量(注意,如果讲座不在线,我肯定会问)。
似乎当人们在实现中创建一个字符串时,它被赋予了一个偏移量,我似乎无法理解为什么需要一个偏移量。即使出于子字符串的目的,我也不完全理解为什么会有偏移量。例如,显然如果你创建一个字符串"David",它实际上是['X', 'X', 'D', 'a', 'v', 'i', 'd', 'X'],或者类似的东西,它被'X's 所抵消。这是为什么呢?
【问题讨论】:
-
您在看哪个 Java 版本? Oracle 的 JDK 7 实现不再使用偏移字段。
-
在 Java 7 更新 4 之前,字符串可以指向另一个字符串的一部分,因此它需要知道该部分的开始位置。
-
好问题!我一直认为偏移的原因是您可以执行
split和substring等等,而无需复制支持数组。但我没有证据表明这是决定以这种方式实施的实际理由。 -
我在问题中添加了更多内容。 @DavidWallace,我不确定抵消也会有什么帮助。
-
好吧,我的意思是,如果你这样做
"David asked a good question".split(" ");,那么生成的"David", "asked", "a", "good"和"question"可以共享与原始String相同的字符数组,但只是有不同偏移量和长度,以便它们显示数组的不同部分。这样一来,角色本身就不需要被复制了。
标签: java string implementation