String substring(int beginIndex, int endIndex) 返回原字符串的子字符串这方法,只要是稍微了解点java的人都知道,就像知道1+1==2同样简单。不过其中的猫腻不多有人关注,就像基本没人问1+1为何等于2同样。 java
String s = "hello world!"; 优化
String subStr = s.substring(1,2); spa
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对象,原来的字符串就让它自生自灭吧。 string