Java提供了三種字符串對象,分別爲String,StringBulider,StringBufferjava
String在操做時不修改原對象,而是會生成一個新的String對象來做爲返回結果。 //適用於較少修改字符串的狀況。安全
StringBulider是爲了解決對String頻繁修改的效率底下問題產生的,對StringBulider的操做會修改原對象。 // 適用於單線程頻繁修改字符串的狀況。多線程
StringBuffer效果與StringBuilder相似,但它加入了線程安全。 //適用於多線程頻繁修改字符串的狀況。app
public class Test{ public static void main(String[] args){ String s1 = "hello",s3; StringBuilder s2 = new StringBuilder("hello"); StringBuilder s4; s3 = s1.toUpperCase(); s4 = s2.append("world"); System.out.printf("String:" + s1 + "\n" + "StringBuilder:" + s2); //String:hello s1無變化 //StringBuilder:helloworld s2發生變化 } }
對於效率問題須要注意,即使有時候編譯器會進行優化(隱式地建立StringBulider來防止頻繁建立String對象),在部分狀況下它仍比不上徹底使用StringBuilder。顯式地建立StringBuilder並給定最大長度能極大地提高對字符串頻繁操做的效率。ide
集合類都繼承自Object,故都有toString()方法並覆蓋了它,以便容器能表達自身。但願toString()方法打印對象內存地址優化
import java.util.*; public class Test{ public String toString(){ return "TestAddress:" + super.toString() + "\n"; //return "TestAddress:" + this + "\n"; } public static void main(String[] args){ List<Test> t = new ArrayList<>(); for (int i = 0;i < 5;i++){ t.add(new Test()); } System.out.println(t); } }
編譯器看見TestAddress後,發現一個+號,會試着將後面對象轉換爲String類型,即調用對象的toString方法。若是寫成註釋樣子,則會發生toString方法的遞歸調用,從而致使棧溢出。ui
String基本方法this
Java提供了printf(),該方法相似於c語言的輸出格式,能夠進行格式化輸出;又提供了一樣效果的format(),但它可用於PrintWriter和PrintStream。spa
public class Test{ public static void main(String[] args){ int x = 10; double y = 10.333; System.out.println("[" + x + " "+ y + "]"); System.out.printf("[%d %.3f]\n", x, y); System.out.format("[%d %.3f]", x, y); //結果 //[10 10.333] //[10 10.333] //[10 10.333] } }
Java中,全部新格式化功能都由java.util.Formatter處理,能夠將它看做一個翻譯器,將格式化字符串與數據翻譯成想要的結果,建立Formatter對象時,還須要向其構造器傳入參數,以便告訴它須要向哪裏輸出結果。線程
import java.util.Formatter; public class Test{ public static void main(String[] args){ int x = 10; double y = 10.333; Formatter f = new Formatter(System.out); f.format("[%d %.3f]\n", x, y); Formatter g = new Formatter(System.err); g.format("[%d %.3f]\n", x, y); //輸出到標準流 //輸出到錯誤流 } }
更精細的格式話說明符須要能夠達到更加美觀的輸出效果,抽象語法爲:
%[argument_index$][flags][width][.precision]conversion
argument_index就是格式化字符串;flags表示左對齊或右對齊,有-符號即左對齊,默認爲右對齊;width爲一個域的最小寬度;.precision用於字符串表示字符串輸出的最大長度,用於小數則表示要保留的小數位數。
import java.util.Formatter; public class Test{ public static void main(String[] args){ Formatter f = new Formatter(System.out); f.format("%-8s %-8s %-8s %-10s\n","name","id","salary","address"); f.format("%-8s %-8.8s %-8.3f %-10.12s\n","sakura","2015100320",8000.64651,"wuhan of Chinese"); //f.format("%-8s %-8.8d %-8.3f %-10.12s\n","sakura",2015100320,8000.64651,"wuhan of Chinese");
//結果以下 //name id salary address //sakura 20151003 8000.647 wuhan of Chi //注:第三條語句將.precision用於整數,拋出異常 } }
Formatter經常使用類型轉換