常見問題1. ?String和new String的區別
2. ?String和StringBuffer的轉換
3. ?String StringBuffer StringBuilder的區別
4. ?==和equal的區別
1. ?String str1 =“ABC" ??和 String ?str2 ?= new String("ABC")的區別 ??
對于字符串:其對象是存儲在棧中的""定義的存儲在常量池中 ??new 確定存儲在堆中
相等的字符串在常量池中只有一份,在堆中有多份(String str在棧中 ?“ABC"在常量池中 new String() 在堆中)
String str1="ABC"可能創建一個對象或者不創建對象,
如果"ABC"這個字符串在java String池里不存在,會在java String池創建這個一個String對象("ABC")如果已經存在,str1直接reference to 這個String池里的對象。
String str2 = new String("ABC")至少創建一個對象,也可能兩個。
因為用到new關鍵字,會在heap創建一個 str2 的String 對象,它的value 是 "ABC".同時,如果"ABC"這個字符串在java String池里不存在,會在java String池創建這個一個String對象("ABC").
String str1 = new String(“abc”) ???????str1 != str2 ?????(== 與equals的區別) ?
String str2 = new String("abc") ??
String str3 = "ABC" ?????????????????????????str3 = str4
String str4 = "ABC" ?????????????????????????str3 = str4 = str5
String str5 = "A"+"BC"; ?
String和StringBuffer的轉換
String轉StringBuffer: ?StringBuffer sb = new StringBuffer(s); ??String ?s ?= new String("xxx"); StringBuffer轉String: ?String str = sb.toString();
String和StringBuffer ?StringBuilder的區別
執行速度:StringBulider>StringBuffer>String
變量(常量)線程安全。。
?String ?????????????????????????????????????????????????????????????????
常量,不可變的
在進行字符串處理時,會產生新的String對象 ?????????
添加字符串使用“+” ???????????????????????????????????????????
線程安全
StringBuffer ???
變量,可以修改內容
在進行字符串處理時,不會產生新的String對象
添加字符是使用append()
線程安全的(多線程程序中可以使用但執行效率緩慢)
????????StringBuilder
??????? 變量,可以修改內容
線程不安全的(單線程中的性能比StringBuffer高)
總結:
1.如果要操作少量的數據用 = String
2.單線程操作字符串緩沖區 下操作大量數據 = StringBuilder
? 3.多線程操作字符串緩沖區 下操作大量數據 = StringBuffer
4.==和equal的區別
==是一個運算符 ??equals則是string對象的方法
==比較的是引用類型 比較的是地址值是否相同
equals比較的是內容是否相同(堆中的內容是否相同)
擴展String的一種方式比StringBuffer快的多 ?
e.g. ?????String ?s ?= "hello"+"you"+"hao"這種方式比StringBuffer的append()快的多,這就被jvm解析成StringBuffer對象的拼接 ???
String s = "hello" String s2 = "you" ??String s3 = "hao" ??String s4 = s+s2+s3這種方式比StringBuffer慢的多這樣jvm就規規矩矩的拼接String字符串了