標籤:
String
String的構造方式有n種(據說n==11),常見的例舉一二:
// 1String s1 = "hello world";// 2String s2 = new String("hello world");// 3char[] a = {‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘};String s3 = new String(a, 1, 3); // start length // 4String s4 = "hello world";String s5 = new String(s4); // cloneString s6 = s4; // reference
String類常用方法:
String s = "hello world";// toArraychar[] a = s.toCharArray();// charAtchar b = s.charAt(0);// get lengthint len = s.length();// compareint c = s.compareTo("hello"); // 返回字元差boolean f = s.equals("hello"); boolean g = s == "hello"; // 地址層面的比較// move blankString h = s.trim();// cut and addString d = s.concat(" i love you"); // hello world i love youString j = s + " i love you";String e = s.substring(1, 3); //out el startIndex endIndex
// int(or other types) -> Stringint a = 100;String s = String.valueOf(a);
StringBuffer & StringBuilder
因為String對象是不可變的,每次操作都會產生一個新的String對象,所以如果要修改字串,就要用StringBuffer和StringBuilder。
StringBuffer s = new StringBuffer("hello world");// deletes.delete(0, 6); // world start end// reverses.reverse(); // dlrow// appends.append(" world"); // dlrow world// inserts.insert(0, 100); // 100dlrow world// replaces.replace(0, 3, "hello"); // hellodlrow world // setCharAts.setCharAt(0, ‘d‘); // dellodlrow world // String <-> StringBufferString a = s.toString();StringBuffer b = new StringBuffer(a); 進階比較
String和StringBuffer以及StringBuilder最主要的區別當然不是能不能修改那麼簡單。
既然已經有了String類,為什麼還要StringBuffer和StringBuilder?
String是字串常量,但是它具有不可變性,就是一旦建立,對它進行的任何修改操作都會建立一個新的字串對象。StringBuffer 字串可變數,是安全執行緒的,和StringBuilder類提供的方法完全相同。如果查看java的原始碼(即java安裝目錄的src.zip檔案),就會發現它和StringBuilder類的方法的區別就是,在每個方法前面添加了"synchronized",保證其是安全執行緒的。StringBuilder 字串可變數,是線程不安全的。在java API中指明:這個類是在JDK 5才開始加入的,是StringBuffer的單線程等價類別。(其他兩個String和StringBuffer類,都是JDK 1.0開始)
多線程的情況下才需要考慮安全執行緒問題。比如一個 StringBuilder ,可能被多個線程訪問,那麼如果沒有 synchronized 的話,第一個線程改變了其值,之後又有第二個線程改變了它的值。當切換回第一個線程時,讀到的就是第二個線程修改後的值了。 如果不考慮多線程,StringBuilder 比StringBuffer要快。
Java中的String、StringBuffer以及StringBuilder的用法和區別