標籤:builder margin static 字串常量 pool print system 總結 地址
- 特性一:不可變性
- String s=new String(“yangyun")
- s=s.toUpperCase();
- 這裡的s,s佔用的空間是不一樣的(地址不相同),前提是toUpperCase函數確實改變了原始s的內容。
為什麼String是不可變對象?-----cankai
- 特性三:字串的串連
- 方法一:使用+=對字串進行串連
- 使用+,+=連結字串的後果: (會產生一大堆需要記憶體回收的中間對象,從而效率低下)
- JVM最佳化--自動的使用StringBuilder進行串連--不會產生不被引用的中間對象
- 但是每串連一個String對象,JVM雖然不會建立一個沒有辦法引用的String對象,但是他會每次都建立一個StringBuilder對象---也是浪費
- 方法二:使用StringBuilder的append函數對字串進行串連---------推薦
- 只需要建立一個StringBuilder進行串連
- 特性四:"字串常量"
- 說明:字串是不可變的,但是字串引用(指向)是可以改變的,字串常量是指字串與常量進行綁定之後,指向就不能發生變化
- 舉例:
- final String a=new String("a");//這裡的a就不能改變指向
- 特性五:重要的String函數(不熟悉的)
- String.intern()—加入字串常量池,並返回該字串
- String.equalsIgnoreCase()—忽略大小寫比較
- String.indexof(string1)------是否存在包含string1,存在返回index,不存在返回-1
- string.lastIndexof(string)---從後向前尋找
- string.contains(string)------是否存在,返回boolean類型
- string.trim()-----------------刪除前後的空白符號
- 2.StringBuilder類學習
- 說明:用於連接字串,對字串進行處理
- 建構函式:
- StringBuilder sbuilder=new StringBuilder();//緩衝區16
- StringBuilder sbuilder=new StringBuilder(20);//緩衝區為20
- StringBuilder sbuilder=new StringBuilder(“Hello”);//初始字元Hello
- 功能函數:
- append();//向末尾添加字串
- reverse();//逆向裝置字串
- insert(index,value);//從index開始處開始插入字串
- delete(startindex,endindex);//刪除index在startindex~endindex-1的字元
- replace(startindex,endindex,String);//使用String代替startindex~endindex之間的字元,長度自行調整,String不夠用空格添加,長了就截取
- toString();轉為String
- 無意識的遞迴-對象toString函數的調用
- List<Person> list=new ArrayList(Arrays.asList(new Person(“Yangyun”),new Person(“Tim")));
- System.out.println(list);
- 如果:Person沒有toString()對象——會自動調用每一個對象的super.toString()—Object的toString函數
- 調用對象的toString()函數,若對象沒有toString函數,調用對象的父類的toString()函數
- 3.字串pool與heap(重要)
- 階段一:編譯階段
- 字串常量放到一個字串池(pool of literal strings)中,而運行時字串常量池成為常量池的一部分。
- 這裡的字串常量指的是String string="yangyun",String string="abc"+"def";
- 階段二:程式員使用intern方法可以改變字串池的大小。
- 當調用intern()方法時,如果字串池中已經包含一個等於此String 對象的字串 (用equals(Object)方法確定),則返回字串池中的字串。否則,將此String 對象添加到字串池中,並返回此String 對象的引用。
- 字串的比較:
- 1.String.equals(String)--比較字串的
- 2.==(實際比較的是String對象地址)
- 舉例:
- String str1 = "java"; // str1指向字串池
- String str2 = "blog"; // str2指向字串池
- String s = str1 + str2;//這條語句會建立多少個對象
- s是指向堆中值為"javablog"的對象,+ 運算子會在堆中建立起來兩個String對象,這兩個對象分別是"java","blog",也就是說從字串池中複製這兩個值,然後在堆中建立兩個對象,然後再建立對象s,然後將"javablog"的堆地址賦給s。 // 這條語句總共建立了多少個對象?(三個吧)
- 如果改成以下兩種方式:
- 1.s是常量池中的字串
- String s = "java" + "blog"; // 直接將"javablog"放入字串池中
- System.out.println(s == "javablog"); // 結果為true
- 2.s是堆中的字串
- String s = str1 + "blog"; // 不放入字串池,而是在堆中分配
- System.out.println(s == "javablog"); // 結果為false
- 總結:
- 三種建立String對象的方式
- String string=“abc”;//pool中有則不建立直接引用,否則建立並加入pool
- final String string=“abc”;//pool中
- String string=new String(“abc”);//heap分配記憶體建立對象
- String string=“abc”+s1;//s1為new建立—那麼string也是使用heap
參考文獻:
http://www.codeceo.com/article/why-java-string-class-static.html
6.Java中的字串