Java中的String不再糾結
先分享一下java中string的一些小專題吧,這部分比比較基礎,但是也非常的有用。我發現很多面試官像中了邪一樣就愛問這個。。string的種種,糾結,希望這篇文章讓大家不再糾結。。
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”,如果沒有則建立。如果有的話,則則直接把str1指向那個位置。如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裡面有大量的學習資料可以下載。
第二種建立字串的方法是通過new關鍵字,還是java的記憶體分配,java會將new的物件放在堆中,這一部分物件是在執行時建立的物件。所以我們每一次new的時候,都會建立不同的物件,即便是堆中已經有了一個一模一樣的。
寫一個小例子
String str1 = "string";
這個的執行結果是
true //解釋:兩個字串的內容完全相同,因而指向常量池中的同一個區域
false //解釋:每一次new都會建立一個新的物件
false // 解釋: 注意==比較的是地址,不僅僅是內容
true //介紹一下intern方法,這個方法會返回一個字串在常量池中的一個地址,如果常量池中有與str3內容相同的string則返回那個地址,如果沒有,則在常量池中建立一個string後再返回。實際上,str3現在指向了str1的地址。
這就是讓人糾結的string了,現在你可以說話了。。。很多人有這樣的疑問就是既然string是不變的,那麼為什麼str1 + “some”是合法的,其實,每次對string進行修改,都會建立一個新的物件。
所以如果需要對一個字串不斷的修改的話,效率是非常的低的,因為堆的好處是可以動態的增加空間,劣勢就是分配新的空間消耗是很大的,比如我們看下面的測試。
long start = System.currentTimeMillis();
我的機器上執行結果是the run time is 3538 ms 如果你把迴圈的次數後面再增加幾個0就會更慢。因為每一次迴圈都在建立心的物件,那麼JDK如何解決這個問題?
下面就要說第二個類StringBuffer。
StringBuffer是一個執行緒安全的,就是多執行緒訪問的可靠保證,最重要的是他是可變的,也就是說我們要操作一個經常變化的字串,可以使用這個類,基本的方法就是append(與string的concat方法對應)和insert方法,至於怎麼使用,就不多講了,大家可以自己檢視API。
StringBuilder sb = new StringBuilder("string builder");
測試一下,這次只需要8ms,這就是效率。
那麼接下來,就要問StringBuilder是幹什麼的,其實這個才是我們嘗使用的,這個就是在jdk 1.5版本後面新增的新的類,前面說StringBuffer是執行緒同步的,那麼很多情況下,我們只是使用一個執行緒,那個同步勢必帶來一個效率的問題,StringBuilder就是StringBuffer的非執行緒同步的版本,二者的方法差不多,只是一個執行緒安全(適用於多執行緒)一個沒有執行緒安全(適用於單執行緒)。
其實看了一下jdk原始碼就會發現,StringBuffer就是在各個方法上加上了關鍵字syncronized
以上就是對三個字串類的一個總結,總之不要在這上面糾結。。。。。。不想介紹太多的方法,總覺得那樣會把一篇部落格弄成API文件一樣,而且還非常的繁瑣。都是些體會,希望有所幫助。起碼不要再糾結,尤其是面試。。。。
相關文章
- java中的StringJava
- Java中string的特性Java
- JAVA中String format的用法JavaORM
- 每天都在糾結與迷茫中徘徊
- Java中String類的常用方法Java
- Java 中 String 的構造方法Java構造方法
- Java 中 String 的常用方法(一)Java
- Java中的String與常量池Java
- java中String的21種用法Java
- Java 中 String 的常用方法(二)Java
- 工作在矛盾糾結中進行著
- Java-String的常用方法總結!Java
- 【JAVA】Java中 File f=new File(String parent ,String child)Java
- JAVA中Object轉StringJavaObject
- 變數命名的糾結變數
- SLG大戰中的騰訊遊戲:武器很多,糾結不少遊戲
- Java中String類的初始化?Java
- Java 中拼接 String 的 N 種方式Java
- 糾結的連等賦值賦值
- 轉:Java String中的HashCode和EqualJava
- 不再怕面試被考字串---詳解Java中的字串面試字串Java
- Kotlin與java的糾纏史KotlinJava
- Swift中String和Character的使用與總結Swift
- Java中main方法引數String[ ] args的使用JavaAI
- 轉:Java中String與byte[]的轉換Java
- JAVA中如何正確的用String轉DateJava
- Java中String類不可變性的好處Java
- 全面解析Java中的String資料型別Java資料型別
- JAVA中String與StringBuffer的區別Java
- Java中的String判斷是不是為空Java
- Java 中的 String 為什麼是不可變的?Java
- UIMenuController糾結之夜UIController
- JAVA 中 string 和 int 互相轉化Java
- 關於糾結的recycle pool的設定
- 軟體測試:Java-String的常用方法總結Java
- 標準 C++ 中的 string 類的用法總結C++
- java中String類常用方法的使用與例項Java
- ant如何替換JAVA程式碼中的String變數中的值?Java變數