我一直在看实现,我不明白为什么会有偏移。我认为这很重要。
我正在参加Sedgewick讲授的算法课程,现在我们正在谈论弦乐。在演讲中他简要讨论了字符串的实现,但他没有说明为何有偏移(注意,如果讲座不在线,我肯定会问)。
似乎当一个人在实现中创建一个String时,会给出一个偏移量,而我似乎无法理解为什么需要一个。即使是子字符串的目的,我也不太理解为什么你会有一个偏移量。例如,显然如果你创建一个字符串"David"
,它实际上是['X', 'X', 'D', 'a', 'v', 'i', 'd', 'X']
,或者是那种性质的东西,它被'X'
s偏移。这是为什么?
答案 0 :(得分:5)
这对于需要从另一个更长的字符串派生字符串的情况非常有用,类似于substring()。
在这种情况下,可以使用相同(不可变)的后备阵列,同时调整偏移量和长度,以节省内存并优化性能。
在JDK7中不再是这种情况。
答案 1 :(得分:1)
偏移通常作为优化存在。例如,在与字符数组相关的项中,可以多次使用相同的字符数组从数组中构造多个字符串。这是因为您将使用具有不同偏移量和长度的相同数组。
这是一种非常有效的优化,因为它可以防止构造新的字符数组,仅仅是为了让您希望以零索引开头的字符。例如,在读取一个字节块(可能来自套接字)之后,您可以将其组合成字符串大小的消息,而不必进行不必要的字节复制。