熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

不再糾結Java中的String類

2013-11-23 20:40:56  來源: Java開源技術 
    String是我們經常用到的一個類型其實有時候覺得寫程序就是在反復的操作字符串這是C的特點在java中jdk很好的封裝了關於字符串的操作今天主要講的是三個類String StringBuffer StringBuilder 這三個類基本上滿足了我們在不同情景下使用字符串的需求
   
    先說第一個String
   
    JDK的解釋是 Strings are constant; their values cannot be changed after they are created也就是說String對象一旦被創建就是固定不變的了(你一定有問題但請先等一等耐心讀下去)這樣的一點好處就是可以多線程之間訪問因為只讀不寫
   
    一般情況下我們以下面兩種方式創建一個String對象
     
    兩種方式是有區別的這和java的內存管理有關前面已經說過string創建之後是不可變的所以按照第一種方式創建的字符串會放在棧裡更確切的是常量池中常量池就是用來保存在編譯階段確定好了大小的數據一般我們定義的int等基本數據類型就保存在這裡
   
    其具體的一個流程就是編譯器首先檢查常量池看看有沒有一個string如果沒有則創建如果有的話則則直接把str指向那個位置
   
    第二種創建字符串的方法是通過new關鍵字還是java的內存分配java會將new的對象放在堆中這一部分對象是在運行時創建的對象所以我們每一次new的時候都會創建不同的對象即便是堆中已經有了一個一模一樣的
   
    寫一個小例子
  

  

   
    這個的運行結果是
   
    true //解釋兩個字符串的內容完全相同因而指向常量池中的同一個區域
   
    false //解釋每一次new都會創建一個新的對象
   
    false // 解釋 注意==比較的是地址不僅僅是內容
   
    true //介紹一下intern方法這個方法會返回一個字符串在常量池中的一個地址如果常量池中有與str內容相同的string則返回那個地址如果沒有則在常量池中創建一個string後再返回實際上str現在指向了str的地址
   
    這就是讓人糾結的string了現在你可以說話了…很多人有這樣的疑問就是既然string是不變的那麼為什麼str + some是合法的其實每次對string進行修改都會創建一個新的對象
   
    所以如果需要對一個字符串不斷的修改的話效率是非常的低的因為堆的好處是可以動態的增加空間劣勢就是分配新的空間消耗是很大的比如我們看下面的測試
   

  

 
    我的機器上運行結果是the run time is ms 如果你把循環的次數後面再增加幾個就會更慢因為每一次循環都在創建心的對象那麼JDK如何解決這個問題?
   
    下面就要說第二個類StringBuffer
   
    StringBuffer是一個線程安全的就是多線程訪問的可靠保證最重要的是他是可變的也就是說我們要操作一個經常變化的字符串可以使用這個類基本的方法就是append(與string的concat方法對應)和insert方法至於怎麼使用就不多講了大家可以自己查看API
   

  

 
    測試一下這次只需要ms這就是效率
   
    那麼接下來就要問StringBuilder是干什麼的其實這個才是我們嘗使用的這個就是在jdk 版本後面添加的新的類前面說StringBuffer是線程同步的那麼很多情況下我們只是使用一個線程那個同步勢必帶來一個效率的問題StringBuilder就是StringBuffer的非線程同步的版本二者的方法差不多只是一個線程安全(適用於多線程)一個沒有線程安全(適用於單線程)
   
    其實看了一下jdk源代碼就會發現StringBuffer就是在各個方法上加上了關鍵字syncronized
   

  

 
    以上就是對三個字符串類的一個總結總之不要在這上面糾結……不想介紹太多的方法總覺得那樣會把一篇博客弄成API文檔一樣而且還非常的繁瑣都是些體會希望有所幫助起碼不要再糾結尤其是面試…
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28892.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.