您現在的位置是:首頁 > 綜合
解讀Java程式設計思想--String
- 由 開課吧科科 發表于 綜合
- 2021-10-24
strⅰng怎麼讀的
程式設計思想和語言的種類沒有關係,它應該是跨語言的,只是可能在底層實現的細節不同而已。平常也接觸過很多技術開發,但很少遇到一個程式碼寫得很棒的,有的是程式碼不美觀、不規範,有的是不會利用語言特性來簡化自己的程式碼。。。等等。
1、String物件是不可變的。
2、String類中每一個看起來會修改String值的方法,實際上都是建立一個全新的String物件,以包含修改後的字串內容。最初的String物件絲毫未動。
3、方法呼叫,String為參
public class Test01 { public static void main(String[] args) { String oldStr = “HelloWorld”; System。out。println(oldStr);//HelloWorld String newStr = upCase(oldStr); System。out。println(newStr);//HELLOWORLD System。out。println(oldStr);//HelloWorld } public static String upCase(String temp){ return temp。toUpperCase(); }}123456789101112複製程式碼型別:[java]
呼叫upCase(),String物件作為引數時,都會複製一份引用,而該引用所指物件其實一直待在單一的物理位置上。
upCase()方法中,
1)引用名稱temp,只有執行upCase()的時候,區域性引用temp才存在;
2)upCase()執行結束,temp就消失了;
3)upCase()的返回值,也只是最終結果的引用
4、“+”與StringBuilder
public class Test02 { public static void main(String[] args) { String str = “love” ; String newStr = “I ” + str + “ code” + “ very much” ; System。out。println(newStr);//I love code very much }}12345678複製程式碼型別:[java]
該程式碼工作可能為,“I”與str連線後生成一個新的字串,然後該新字串再與“code”相連生成一個新的String物件,以此類推。得到最終String。該工作方式行得通,但會產生一大堆需要垃圾回收的中間物件。
反編譯得出結論,上訴程式碼,編譯器建立了一個StringBuilder物件,用以構造最終的String。編譯器會為你的程式碼自動最佳化
5、編譯器會將“+”最佳化成StringBuilder
public class Test03 { public String useString(String[] fields){ String str = “”; for(int i=0 ; i 編譯器會將“+”最佳化成StringBuilder,反編譯得出: useString(),StringBuilder是在迴圈內構造的,每迴圈一次,就會建立一個新的StringBuilder物件 useStringBuilder(),只生成了一個StringBuilder物件。而且,如果提前知道字串的大概長度,可以顯示的建立StringBuilder並指定大小,這樣可以避免多次重新分配緩衝。 注:StringBuilder呼叫append()時,若寫成append(a+“:”+c),那麼編譯器會為你建立另外一個StringBuilder物件來處理括號內的字串操作 6、無意識遞迴 java中每個類根本上繼承自Object,每個類都有toString()方法,並且覆寫了該方法。如ArrayList。toString(),它會遍歷ArrayList中包含的物件,呼叫每個元素的toString()方法 public class Test04 { public static void main(String[] args) { List 如果你希望toString()方法打印出物件的記憶體地址,也許你會考慮用this關鍵字,例子中Animal類改為 class Animal{ //其它省略。。。 public String toString(){ return this。name + “,classAddress=” + this; }}1234567複製程式碼型別:[java] 然後你就會看到異常,java。lang。StackOverflowError。 當執行this。name+“,classAddress=”+this時,Animal型別轉換成了String型別。編譯器看到一個String物件後面跟著一個“+”,而後面不是String物件,於是編譯器試著將this轉成一個String。於是又呼叫了this上的toString()方法,就發生了遞迴呼叫。 正確的列印物件的記憶體地址,應該呼叫Object。toString()。所以不能使用this,要使用super。toString()。 正確程式碼為: public class Test04 { public static void main(String[] args) { List