跳到主要內容

Java String型別筆記


1.System.out.printf()是從C那邊取得的方法
   String demoStr = "a %s boy which is %d feet height";
   System.out.pintf(demoStr, "litle", 15);

   字串中的%s,%d 分別會被替換成字串little、數值15
   String.format()方法具有相同的使用方式及效果
   例如:string temp = String.format(demoStr, "litle", 15);

   以下為常用替換表示,大小寫區別在輸出的字串以大寫或小寫輸出
   %%  -            用來在字串中表示%
   %d  -             以10進位整數格式輸出,可用於byte、short、int、long
   %f  -              以10進位浮點數格式輸出,可用於float、double、Float、Double、BigDecimal
   %e、%E  -    以科學記號浮點數格式輸出
                        %e指輸出格式遇到字母以小寫表示,%E則為以大寫表示
   %x、%X  -   以16進為整數格式輸出
   %s、%S  -   以字串格式符號輸出
   %c、%C  -   以字元符號輸出
   %b、%B  -   輸出blloean值

   另一個較常見的替換輸出的需求則是在文字左側補上 0
   例如月份可能不想用 2016/1 而是想用 2016/01
   此時可以直接用 String.format("%02d", number); 這樣的方式處理,上色處為0的位數
   上面那行如果輸入數字1會吐字串01回來,數字11則吐字串11

2.String以+運算符大量連結字串時常會被詬病效率低的因素
   在串聯字串相當簡單的情況下,使用String是可以接受的方法
   例如:String temp = "aaa" + "bbb" + "ccc";
   此時使用+運算符會比StringBuilder跟StringBuffer的版本來的快
   這是因為JVM會直接判斷為 String temp = "aaabbccc";
   省掉連結字串的處理

   但大部分使用連結字串的情境,是需要連結變數,此時JDK會自動將 "+" 轉成StringBuilder
   String temp = "hi";
   String temp2 = temp + "hello";

   編譯後類似如下:
   String temp = "hi";
   String temp2 = new StrigBuilder().append(temp).append("hello").toString();

   但這樣並不代表可以任意使用 "+" 這個operator
   例如:
   str += a;
   str += b;
   str += c;

   每一個 += 的過程都會生成了新的StringBuilder物件
   程式的主要瓶頸就在於物件的生成
   如果要串接大量字串,還是使用StringBuilder比較有效率
   str = new StrigBuilder(str).append(a).append(b).append(c).toString()

   StringBuffer是與StringBuilder作用類似的物件,但支援Multi-thread的環境
   在單工的環境下效率會較差
   在部分的Java版本中,做較少量的字串連結時StringBuffer的效率會看似較高
   這只是因為有些版本的StringBuffer的初始化會較StringBuilder來的快
   在大部分的場合,特別是字串連結量大的時候,StringBuilder絕對是首選

   另外順帶一提的是
   String a = "ja" + "va";
   String b = "java";
   System.out.print(a == b);  //output true
 
   JVM會判斷a字串的結果與b字串相同
   進而使兩者從String pool引用相同的字串

3.StringBuilder的清空或移除部分項目
   繼前面提到了 StringBuilder 的使用
   StringBuilder 的 setLength() 是一個相當有趣的 method
   雖然其本身有 delete() 這個 method提供了刪除內容項目的功能
   透過 setLength() 設定StringBuilder的長度也可以做到接近的效果

   例如使用 StringBuilder物件.setLength(0);  就能清空整個StringBuilder物件
   設定的長度較StringBuilder物件長度為短的話,多餘的字串會被清除

4.字串使用split()切割成字串陣列
   這個操作方式要略為注意分割符的後段字元會受到脫逸(trim)影響
   舉例來說"1,2,,,".split(",")  這樣切割出來的內容會是["1","2"]
   而 "1,2,,3,".split(",")則會切成["1", "2", "", "3"]
   分割符切出來的尾端如果是連續的空字串,則這些空字串不會被放進字串陣列
   所以如果要維持字串陣列的長度為固定值,可以在split這個方法傳入第二個參數
   第二個參數的數值為到指定的字串index前都不會進行脫逸,假如是-1就代表整個字串都不會脫逸
   舉例來說 "1,2,,,".split(",", -1),就能得到["1", "2", "", "", ""]
 

留言