再说jdk7的substring——从O(1)到O(N)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 再说jdk7的substring——从O(1)到O(N)

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

 2013/9/27 0:50:10  lvdccyb  程序员俱乐部  我要评论(0)
  • 摘要: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也讨论过但是,新的设计引来的问题是:性能有所下降(参见上述引文)。主要是
  • 标签:jdk
  • 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))方式的代码,影响其实并不大。

上一篇: 美第四大运营商T-Mobile宣布停售黑莓手机 下一篇: 没有下一篇了!
发表评论
用户名: 匿名