推薦你們使用字符串直接賦值

 在四海學的時候,可能須要咱們通過沉澱纔會去想一些事情,有的時候不知道爲何這樣或者那樣的時候,從今天看是,小王老師打算給你們開闢一個課程,就是個人讀書筆記。安全

首先咱們來認識一下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的對象
相關文章
相關標籤/搜索