String不可變:在內存(堆)中建立了一個字符串以後,它不能被改變,對字符串的操做方法都是新建立了一個字符串,原字符串不變java
須要可變字符串,通常使用StringBuffer(線程安全)、StringBuilder(速度快),減小系統垃圾回收的資源損耗正則表達式
String方法:數組
substring(int beginIndex, int endIndex)截取字符串並返回其[beginIndex,endIndex-1]範圍內的內容安全
String類包含三個成員變量:char value[],int offset,int count
app
jdk6中,會建立新的字符串,可是這個string仍指向同一個value,只有offset和count不一樣,容易致使性能問題性能
jdk7中,對substring進行了優化,會建立一個新的數組優化
replace不使用正則表達式,replaceAll、replaceFirst使用正則表達式,replaceFirst替換第一個ui
String s =
"my.test.txt"
;
System.out.println(s.replace(
"."
,
"#"
)); // my#test#txt
System.out.println(s.replaceAll(
"."
,
"#"
)); // ###########
System.out.println(s.replaceFirst(
"."
,
"#"
)); // #y.test.txt
String 對「+」的重載,在代碼執行時引入StringBuilder類,調用append方法進行字符串拼接,最終經過toString 返回結果線程
字符串拼接方式:直接+,concat()方法,append()方法等code
String.valueOf()實際是調用了包裝類的toString方法
jdk7中新增了switch對string的支持
String常量池
由於String是不可變的,爲提高效率,引入了字符串池的概念
String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,因此會入池. String s4 = s1 + "b"; //s1是變量,"b"是常量,變量+常量!=常量,因此不會入池.
入池以後,會先查找池中有無此對象,若是有,則對象引用指向此對象;若是無,則先建立此對象,再讓對象引用指向此對象
存在於.class文件中的常量池,在運行期被JVM裝載,而且是能夠擴充的
intern()方法是一個能夠擴充常量池的方法,當String實例調用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,若是有,則返回其的引用,若是沒有,則在常量池中增長一個Unicode等於str的字符串並返回它的引用
String s0= "kvill"; String s1=new String("kvill"); String s2=new String("kvill"); System.out.println(s0==s1); //false System.out.println("**********"); s1.intern(); s2=s2.intern(); //把常量池中「kvill」的引用賦給s2 System.out.println( s0==s1); //false s1.intern()返回值未賦值給s1 System.out.println( s0==s1.intern() ); //true System.out.println( s0==s2 ); //true