您現在的位置是:首頁 > 綜合

解讀Java程式設計思想--String

  • 由 開課吧科科 發表于 綜合
  • 2021-10-24
簡介HELLOWORLDSystem

strⅰng怎麼讀的

程式設計思想和語言的種類沒有關係,它應該是跨語言的,只是可能在底層實現的細節不同而已。平常也接觸過很多技術開發,但很少遇到一個程式碼寫得很棒的,有的是程式碼不美觀、不規範,有的是不會利用語言特性來簡化自己的程式碼。。。等等。

解讀Java程式設計思想--String

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 list = new ArrayList<>(); for(int i=0 ; i<5 ; i++){ list。add(new Animal(i)); } System。out。println(list);//[老鼠, 牛, 老虎, 張飛, 張飛] }}class Animal{ private String name; public Animal(int i){ switch(i){ case 0: this。name = “老鼠”; return; case 1: this。name = “牛”; return; case 2: this。name = “老虎”; return; default: this。name = “張飛”; } } public String toString(){ return this。name; }}12345678910111213141516171819202122232425262728複製程式碼型別:[java]

如果你希望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 list = new ArrayList<>(); for(int i=0 ; i<3 ; i++){ list。add(new Animal(i)); } System。out。println(list); //[老鼠,classAddress=com。test01。thinking。mystring。Animal@5594a1b5, // 牛,classAddress=com。test01。thinking。mystring。Animal@79b4d0f, // 老虎,classAddress=com。test01。thinking。mystring。Animal@6b2fad11] }}class Animal{ private String name; public Animal(int i){ switch(i){ case 0: this。name = “老鼠”; return; case 1: this。name = “牛”; return; case 2: this。name = “老虎”; return; default: this。name = “張飛”; } } public String toString(){ return this。name + “,classAddress=” + super。toString(); }}

Top