今天再看JDK源码的时候看到了String类的不同版本的实现方式的不同,主要是substring这个方法,JDK6里面的实现方式是:
![jdk60.png wKioL1Qn0-HhwQcAAAL5qPztuWI993.jpg](https://i-blog.csdnimg.cn/blog_migrate/dc91c42ee69b896af67be2b0747c91ea.jpeg)
![jdk61.png wKiom1Qn07jxe5AZAAEwB_pzjz8521.jpg](https://i-blog.csdnimg.cn/blog_migrate/0594f5d52eed65f337214b404e3b15a5.jpeg)
很明显可以看到,调用String对象的substring方法后指向的对象地址并没有发生改变,只是改变的是偏移量,这样的话在GC阶段就有可能造成内存泄露了。
还好查了一下资料JDK7解决了这个问题,于是赶紧查看了JDK7的源码:
![jdk71.png wKioL1Qn1HSTr4pSAAKxL6VlXRo252.jpg](https://i-blog.csdnimg.cn/blog_migrate/c3b55c650c46d650266833f6879e4897.jpeg)
![jdk70.png wKiom1Qn1EzCgnDVAAJoairhoMQ543.jpg](https://i-blog.csdnimg.cn/blog_migrate/4cfd26882d3ad18162f0d6e2a0359086.jpeg)
这个里面是通过内存复制的方式重新指向了一个新的地址,解决了内存泄露的隐患
转载于:https://blog.51cto.com/chenyanxi/1559131