JDK7和JDK6中substring()的不同

原创
2013/11/21 22:02
阅读数 1.2K

     String substring(int beginIndex, int endIndex) 返回原字符串的子字符串方法,只要是稍微了解点java的人都知道,就像知道1+1==2一样简单。不过其中的猫腻很少有人关注,就像基本没人问1+1为什么等于2一样。

      String s = "hello world!";

      String subStr = s.substring(1,2);

      subStr返回"e",现在来分析分析内存分配问题:

      

      String s = "hello world!" 会先在堆内存中分配一段空间,new一个字符串对象,然后s指向这个对象;在jdk1.6中String subStr = s.substring(1,2);会把subStr变量指向“hello world!”对象中的“e”,而不是重新新建一个对新,而JDK1.7中会创建一个新的字符串对象,这就是JDK1.7对这个方法的优化。

      可能有人要吐槽,这尼玛也叫优化。现在来想这个问题,如果现在有一个很长的字符串,只需要用的字符串当中的很少的一段,用substring截取需要的字符串之后,在jdk1.6中,因为有subStr对象指向它,字符串依然存在在内存中,而在1.7中,新创建了一个字符串,s这个变量如果在后面的程序已经没在使用过,垃圾回收机制会自动回收s和s指向的对象。

      但现在依然运行在jdk1.6以及以前版本的jdk上的程序该怎么办,一个比较简单的方法是使用substring方法的时候可以在后面加一个空字符串,就像:String subStr = s.substring(1,2)+"";这样subStr会指向新的String对象,原来的字符串就让它自生自灭吧。

展开阅读全文
加载中

作者的其它热门文章

打赏
3
39 收藏
分享
打赏
9 评论
39 收藏
3
分享
返回顶部
顶部