歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java學習筆記:字符串

這幾天看了Java字符串,所以寫出來,當做學習筆記。

一,String與StringBuilder
首先,String是不可變的,StringBuilder是可變的。所以,在使用上肯定是有區別的,當我們一個字符串經常會改變的時候,最好使用StringBuilder,當一個字符串很少改變使用String更佳。下面一個例子比較一個經常改變的字符串在分別使用String和StringBuilder時的性能。

//使用String
public class Test1 {
    public static void main(String[] args) {
        String str = "";        //差別在這
        for (int i = 0;i < 10;i++) {
            str = str + i;      //差別在這
        }
    }
}

//使用StringBuilder
public 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);

Copyright © Linux教程網 All Rights Reserved