Java字串,java字串截取

來源:互聯網
上載者:User

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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.