为什么Java String实现中存在偏移量?

时间:2013-11-11 03:41:49

标签: java string implementation

我一直在看实现,我不明白为什么会有偏移。我认为这很重要。

我正在参加Sedgewick讲授的算法课程,现在我们正在谈论弦乐。在演讲中他简要讨论了字符串的实现,但他没有说明为何有偏移(注意,如果讲座不在线,我肯定会问)。

似乎当一个人在实现中创建一个String时,会给出一个偏移量,而我似乎无法理解为什么需要一个。即使是子字符串的目的,我也不太理解为什么你会有一个偏移量。例如,显然如果你创建一个字符串"David",它实际上是['X', 'X', 'D', 'a', 'v', 'i', 'd', 'X'],或者是那种性质的东西,它被'X' s偏移。这是为什么?

2 个答案:

答案 0 :(得分:5)

这对于需要从另一个更长的字符串派生字符串的情况非常有用,类似于substring()。

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

在JDK7中不再是这种情况。

答案 1 :(得分:1)

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

这是一种非常有效的优化,因为它可以防止构造新的字符数组,仅仅是为了让您希望以零索引开头的字符。例如,在读取一个字节块(可能来自套接字)之后,您可以将其组合成字符串大小的消息,而不必进行不必要的字节复制。