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