String

String不可變:在內存(堆)中建立了一個字符串以後,它不能被改變,對字符串的操做方法都是新建立了一個字符串,原字符串不變java

須要可變字符串,通常使用StringBuffer(線程安全)、StringBuilder(速度快),減小系統垃圾回收的資源損耗正則表達式

 

String方法:數組

substring(int beginIndex, int endIndex)截取字符串並返回其[beginIndex,endIndex-1]範圍內的內容安全

String類包含三個成員變量:char value[],int offset,int countapp

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
相關文章
相關標籤/搜索