標籤:
轉載請註明出處:jiq?欽‘s technical Blog
(1)String本質:
String對象是不可改變的,任何看起來會修改String對象的操作實際上都是建立了一個全新的Sting對象,然後再該全新對象上修改。而效率更高的StringBuilder正好不同。
(2)String和StringBuffer的區別:
String 類型和 StringBuffer 類型的主要效能區別其實在於String 是不可變的對象,因此在每次對 String 類型進行改變的時候其實都等同於產生了一個新的String對象,然後將指標指向新的String對象。
而如果是使用StringBuffer類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是產生新的對象,再改變對象引用。
(3)StringBuffer和StringBuilder的區別:
StringBuffer是StringBuilder的安全執行緒的版本。從 JDK 5.0 開始,為該類增添了一個單個線程使用的等價類別,即 StringBuilder 。與該類相比,通常應該優先使用 StringBuilder 類,因為它支援所有相同的操作,但由於它不執行同步,所以速度更快。
但是如果將 StringBuilder 的執行個體用於多個線程是不安全的。需要這樣的同步,則建議使用 StringBuffer 。
(4)相關類:
String,StringBuilder,Pattern + Matcher,Scanner。
(5)編碼:
ASCII編碼(IOS-8895-1), ASICII編碼本地化(GB2312,BIG5等),UniCode國際化編碼(UTF-8, UTF-16等)。
(6)兩個位元組:
注意java中的Char,不管是不是漢字,都是兩個位元組。
(7)漢字識別:
/** * java通過判斷當前字元的UniCode碼範圍來判斷當前字元(兩個位元組)是不是漢字 * */staticvoid findChinese(String str){String newStr = "";for(int j=0;j<str.length();j++){newStr = str.substring(j,j+1); //"\\u"是標識UniCode碼用的,代表其後的四位16進位數是對應的UniCode編碼if(Pattern.matches("[\u4E00-\u9FA5]",newStr)){System.out.print(newStr);}}System.out.print("\n");}
(8)編譯時間修改和運行時修改:
關於編譯時間和運行時修改字串(確定字串內容的區別):任何運行時修改字串的動作都會建立新的String對象,但是編譯時間卻不是。
可以從上面代碼看出,b1和b3都是在編譯時間修改好的,而b2是在運行時進行修改的,所以會重新建立一個string對象,而不會指向原有的“123”
編譯時間和運行時還有效率的區別:
String S1 = “This isonly a” + “ simple” + “ test”;
StringBuffer Sb = newStringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你會很驚訝的發現,產生 String S1對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不佔優勢。
其實這是 JVM 的一個把戲,在 JVM 眼裡,這個 String S1 = “This is only a” + “ simple”+ “test”; 其實就是: String S1 = “This is only a simple test”; 編譯時間就已經修改好了字串S1,所以當然不需要太多的時間了。
但大家這裡要注意的是,如果你的字串是來自另外的String 對象的話,速度就沒那麼快了,譬如:
String S2 = “This isonly a”;
String S3 = “simple”;
String S4 = “ test”;
String S1 = S2 +S3 +S4;
這是在運行時才修改S1的內容,這時會老老實實重新建立一個對象,將S1指向它。
Java基礎:字串