Java字符串

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

toString()

集合類都繼承自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經常使用類型轉換

相關文章
相關標籤/搜索