Java字串,java字串截取
Java字串
這幾天看了Java字串,所以寫出來,當做筆記。
一,String與StringBuilder
首先,String是不可變的,StringBuilder是可變的。所以,在使用上肯定是有區別的,當我們一個字串經常會改變的時候,最好使用StringBuilder,當一個字串很少改變使用String更佳。下面一個例子比較一個經常改變的字串在分別使用String和StringBuilder時的效能。
//使用Stringpublic class Test1 { public static void main(String[] args) { String str = ""; //差別在這 for (int i = 0;i < 10;i++) { str = str + i; //差別在這 } }}
//使用StringBuilderpublic class Test2 { public static void main(String[] args) { StringBuilder str = new StringBuilder(); //差別在這 for (int i = 0;i < 10;i++) { str = str.append(i); //差別在這 } }}
把上面的代碼轉化成彙編格式看一下:
//使用String public static void main(java.lang.String[]); Code: 0: ldc #2 // String 2: astore_1 3: iconst_0 4: istore_2 5: iload_2 //從第33行跳轉到這 6: bipush 10 8: if_icmpge 36 11: new #3 // class java/lang/StringBuilder 14: dup 15: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V重複產生許多StringBuilder對象 18: aload_1 19: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 22: iload_2 23: invokevirtual #6 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 26: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 29: astore_1 30: iinc 2, 1 33: goto 5跳轉到第5行 36: return
//使用StringBuilder public static void main(java.lang.String[]); Code: 0: new #2 // class java/lang/StringBuilder 3: dup 4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V初始化一個StringBuilder對象 7: astore_1 8: iconst_0 9: istore_2 10: iload_2 11: bipush 10 13: if_icmpge 28 16: aload_1 17: iload_2 18: invokevirtual #4 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 21: astore_1 22: iinc 2, 1 25: goto 10 //跳轉到第10行 28: return
首先我也不懂彙編,但是上面兩個彙編代碼的goto能看懂,他就是執行到這後跳轉到其他行,就是我們寫的那個迴圈,對,使用String的時候,我們能看到Java幫我們把String換成了StringBuilder,這是Java考慮到效能自己做的最佳化,但是最佳化的好不好呢,因為我們使用String,在迴圈中重複更改一個String,這其實是產生了一系列的String對象,Java最佳化過後也沒改變這個情況,每次迴圈都要產生一個StringBuilder對象。當我們使用StringBuilder的時候,發現在迴圈前面產生一個StringBuilder對象,迴圈內部並沒有新對象產生,明顯的,這種直接使用StringBuilder是效能更高的。
二,格式化輸出1,最簡單的格式化輸出
使用System,out.printf();//就像c語言中一樣使用。
或者使用System.out.format();
其實前者的實現是調用了後者
2,使用Formatter類
這個類初始化的時候可以設定將輸出的東西寫入哪裡,可以是顯示器,檔案。
Formatter f = new Formatter(System.out);//標準輸出
f.format();//控制輸出格式,類似於c,但更強大,例如下面的代碼顯示時間
Calendar c = new GregorianCalendar();Formatter f = new Formatter(System.out);f.format("日期:%1$tY-%1$tm-%1$te\n",c);//%1$代表顯示第一個給定資料,t代表顯示時間,Yme分別是年份,月份,月內日期
結果例子:日期:2015-06-1
3,構造格式化字串
使用String.format();傳回值是格式化好的字串,修改上例
Calendar c = new GregorianCalendar();Formatter f = new Formatter(System.out);String s = String.format("日期:%1$tY-%1$tm-%1$te",c);f.format("%s\n",s);