第01篇 為什么推薦使用String直接賦值


  在四海學的時候,可能需要我們經過沉淀才會去想一些事情,有的時候不知道為什么這樣或者那樣的時候,從今天看是,胖先生打算給大家開辟一個課程,就是我的讀書筆記。

首先我們來認識一下String字符串

一般對象都是通過new關鍵字生成的,但是String還有第二種生成方式,也就是我們最經常使用的直接的聲明方式,比如 String str= "shxt"【建議寫法等號兩端空格】,即是通過直接量"shxt"進行賦值的。對於String對象[String不是基本數據類型]來說,這種方式是極力推薦,但不建議使用new String("不推薦")的方式賦值,為什么呢?胖先生來給你分析一下原因:

public class   myTest{

 

public static void  main(String[] args){

String str1 = "胖先生";

String str2 = "胖先生";

String str3 = new String("胖先生");

String str4 = str3.intern();

//兩個直接量是否相等

boolean b1 = (str1==str2);

//直接量和對象是否相等

boolean b2 = (str1==str3);

//經過intern處理后的對象與直接量是否相等

boolean b3 = (str1==str4);

 

}

 

}    

 

 

注意上面的代碼,我們使用"=="判斷的是兩個對象的引用地址是否相同,也就是判斷是否為同一個對象,打印的結果是true,false,true 。前兩答案我們還是好理解,兩個直接量是同一個對象(經過intern處理后的String對象與直接量是同一個對象),但是通過new生成的對象卻與之不相等,

原因何在?

原因是Java為了避免在一個系統大量使用String對象(為什么會大量產生?因為String類型是我們最經常使用的),於是就設計了一個字符串池(也叫字符串常量池),在字符串池中所容納的都是String字符串對象,它的創建機制就是這樣的:創建一個字符串的時候,首先檢查字符串池中是否有字面值相等的字符串,如果有,則不再創建,直接返回字符串池中該對象的引用,若沒有創建之,然后放到字符串池中,並返回新建對象的引用

那么為什么使用new String("胖先生")就不相等呢?因為直接聲明一個String對象是不檢查字符串池的,也不會把對象放到字符串池中,那當然使用"=="false

那么為什么使用intern方法處理后就又相等了呢?因為intern會檢查當前的對象在字符串池中是否有字面量相同的引用對象,如果有則返回字符串池中的對象,如果沒有則放到字符串池中,並返回當前對象

---------------------------------

對象方法字符串池中會不會產生線程安全問題?好問題吧,我想也是,但是我猜各位四海的學生從來不曾考慮過,因為這些不需要我們考慮,Java已經幫我們考慮好了,String類是一個不可變對象,這個不可變含有兩層意思:一個是String類是final類,不可繼承,不可能產生一個String的子類;二是在String類提供的左右方法中,如果有String返回值,就會新建一個String對象,不對原對象進行修改,這也就保證了對象是不可變的。

那么,放到字符串池中,是不是需要考慮垃圾回收問題呢?不用考慮了,雖然Java的每個對象都保存在堆內存中,但是字符串池非常特殊,它的編譯期已經決定了其存在JVM【虛擬機】的常量池,垃圾回收器是不會對它進行回收的。

-----------------

綜上所述:我們發現Java在字符串的創建方面確實提供了非常好的安全機制,利用字符串池不僅可以提高效率,同時減少了內存空間的占用。

開發中使用直接量賦值方式[推薦]

除非確有必要才新建一個String的對象

  如果想學習Java學習,請聯系QQ: 83604162

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM