确实,重新设计后,更加安全了,但某些情况下,会有很大的性能损失。
?
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))方式的代码,影响其实并不大。