【发布时间】:2015-08-11 04:27:43
【问题描述】:
如何在 java 中创建我们自己的 O(1) 子字符串函数,就像在 jdk 6 中一样。如果有任何方法可以在 jdk 的高级版本上使用 jdk 6 的 substring() ?
【问题讨论】:
如何在 java 中创建我们自己的 O(1) 子字符串函数,就像在 jdk 6 中一样。如果有任何方法可以在 jdk 的高级版本上使用 jdk 6 的 substring() ?
【问题讨论】:
O(1) substring 是因为字符串的底层字符数组可以在对象之间共享。因此substring 只需要创建一个带有指向原始字符串的指针以及偏移量和长度的对象。没有复制实际数据本身,这产生了令人讨厌的效果,即从一个巨大的字符串中取出一个小子字符串,然后删除大字符串,实际上并没有释放内存。这导致代码如下:
String newstr = new String(oldStr.substring(5,9));
而不是看起来更明智:
String newstr = oldStr.substring(5,9);
由于字符串不再共享数据(Java 7 的更新 6 是我认为发生这种情况的地方),这是不可能的,所以如果你想恢复 O(1) 性能,你基本上必须构造你的 自己的字符串类来做。
请注意,您可能正在担心一些不那么重要的事情。除非您的字符串非常很大,否则为它们复制数据的额外成本(空间和时间)可能无关紧要。
对于每个需要后者的函数,将O1String 转换为String 的额外努力,以及与文字字符串的不完美集成,可能会使情况变得更糟。
【讨论】:
在这里您可以查看它是如何在 Java 6 中实现的
【讨论】: