如何在java中创建我们自己的O(1)子字符串函数,就像在jdk 6中一样。

如何在java中创建我们自己的O(1)子字符串函数,就像在jdk 6中一样。,java,string,algorithm,Java,String,Algorithm,如何在java中创建我们自己的O(1)子字符串函数,就像在jdk 6中一样。是否有任何方法可以在jdk的高级版本上使用jdk 6的substring() O(1)子字符串是因为字符串的底层字符数组可以在对象之间共享。因此,substring只需创建一个对象,该对象带有指向原始字符串的指针以及偏移量和长度。没有对实际数据本身的复制,这有一个恼人的效果,即获取一个大字符串的一小子字符串,然后删除这个大字符串,实际上并没有释放内存。这将导致以下代码: String newstr = new Strin

如何在java中创建我们自己的O(1)子字符串函数,就像在jdk 6中一样。是否有任何方法可以在jdk的高级版本上使用jdk 6的substring()

O(1)
子字符串
是因为字符串的底层字符数组可以在对象之间共享。因此,
substring
只需创建一个对象,该对象带有指向原始字符串的指针以及偏移量和长度。没有对实际数据本身的复制,这有一个恼人的效果,即获取一个大字符串的一小子字符串,然后删除这个大字符串,实际上并没有释放内存。这将导致以下代码:

String newstr = new String(oldStr.substring(5,9));
而不是看起来更明智的:

String newstr = oldStr.substring(5,9);
由于字符串不再共享数据(我认为Java7的更新6就是发生这种情况的地方),这是不可能的,所以,如果您想恢复O(1)性能,基本上必须构造自己的字符串类来实现

只是要知道你可能在担心一些不那么重要的事情。除非字符串非常大,否则为它们复制数据的额外成本(在空间和时间上)可能无关紧要


对于每一个需要使用字符串的函数,将
O1String
转换为
String
所付出的额外努力,以及与文本字符串的不完美集成,可能会使情况变得更糟。

这里您可以看到它是如何在Java 6中实现的


你试过什么吗?