`

再说jdk7的substring——从O(1)到O(N)

    博客分类:
  • java
阅读更多
  • JDK7的String重新设计。

确实,重新设计后,更加安全了,但某些情况下,会有很大的性能损失。

 

http://nextmovesoftware.com/blog/2013/07/05/java-6-vs-java-7-when-implementation-matters/

 

主要体现在substring,trim等;

原有设计可能存在内存泄露,我的博客http://lvdccyb.iteye.com/blog/1849542也讨论过

但是,新的设计引来的问题是:性能有所下降(参见上述引文)。

 

主要是,原来是通过共享char数组buffer实现,因此,实际上,即使substring(1),也会对整个string对象引用,从而可能造成内存泄露。现在采用的是copy该缓冲区,单独形成一个String对像,简单的说:

 

JDK7:

String  a = "abc".substring(1); 

该语句完全等价于 JDK6的:

String a =new String("abc".substring(1));

 

JDK6中为了避免内存泄露,也是通过上述new String来实现的。

 

因此,从算法上,原有的是O(1),现在是O(N) ,即要copy N个char,如果N很大,且substring调用很频繁,可能会有性能问题。

 

如果性能确实至关关重要,修改方式:

(1)不使用substring,而是直接引用char数组

(2)新建一个代理类String,使用jdk6的实现方式代理新的String.

 

对于原有jdk6代码中,使用了 new String(line.substtring(XXX,YYY))方式的代码,影响其实并不大。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics