6.Java中的字串

來源:互聯網
上載者:User

標籤:builder   margin   static   字串常量   pool   print   system   總結   地址   

  • 1.String的特性

  • 特性一:不可變性
  • String s=new String(“yangyun")
  • s=s.toUpperCase();
  • 這裡的s,s佔用的空間是不一樣的(地址不相同),前提是toUpperCase函數確實改變了原始s的內容。

  為什麼String是不可變對象?-----cankai 

  • 1.效率問題
  • 如果你知道一個對象是不可變的,那麼需要拷貝這個對象的內容時,就不用複製它的本身而只是複製它的地址,複製地址(通常一個指標的大小)需要很小的記憶體效率也很高。
  • 2.安全性
  • 不可變對象對於多線程是安全的,因為在多線程同時進行的情況下,一個可變對象的值很可能被其他進程改變,這樣會造成不可預期的結果,而使用不可變對象就可以避免這種情況。
  • 3.字串常量池的需要-----後續介紹
  • String s1= "ab" + "cd";  

    String s2= "abc" + "d";

  • s1,s2指向的地方是相同的,hashCode值也相同(可以緩衝HashCode的值),如果String可以改變,那麼s1改變會影響到s2,會帶來安全問題。

 

  • 特性二:重載"+"
  • 操作符重載的含義:特定的操作符在特殊的類中有特別的含義;
  • “+”,”+=“是Java 中僅有的兩個重載運算子;java不允許程式員重載任何的運算子
  • 串連的時候如果發現不是String,會嘗試調用對象的toString 方法
  • //Object類的hashCode函數
    public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}
  • 特性三:字串的串連
  • 方法一:使用+=對字串進行串連
  • 使用+,+=連結字串的後果: (會產生一大堆需要記憶體回收的中間對象,從而效率低下)
  • 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中的字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.