中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Java 深入淺出String

String

String是(shi)一個被final修飾的類,直(zhi)接繼(ji)承于Object,同時也實(shi)現了charsequence接口,String被聲明為final也就(jiu)不可以被繼(ji)承了。由于String的方(fang)法比(bi)較多(duo),這就(jiu)不一一的列出來說了。

在C/C++,String通常都用字符數組(zu)代替,不例外,由于JAVA是(shi)從C++發展來的,String內部其(qi)實也(ye)是(shi)一(yi)個(ge)char[],并且(qie)在JVM啟動(dong)的時候(hou),內部就已經維護了一(yi)個(ge)String池,也(ye)就是(shi)我們(men)常說的字符串緩(huan)沖(chong)區(qu),這里面的字符串不能重復,每個(ge)新來的成員都會被(bei)做比較,如果沒有(you)(you)相同的則加(jia)進(jin)來,有(you)(you)相同的則不加(jia)。

下面看一下String的幾種聲明類(lei)型(xing):

String s = new String("hello");

實際上(shang)這種聲明(ming)方式簡(jian)單明(ming)了的在堆上(shang)新建了一(yi)個(ge)String類型的對象,這個(ge)對象的內部(bu)指針指向一(yi)個(ge)hello 的值。

String s = "hello";

這種聲明方式呢其實是一(yi)種靜態的(de)聲明方式,現在(zai)String池里(li)去尋找是否有(you)(you)一(yi)樣的(de)值(zhi),如果有(you)(you)的(de)話直接拿(na)過來(lai)用,沒有(you)(you)的(de)話會創建一(yi)個(ge)String對象。

String s = "he"+"llo";

這(zhe)種(zhong)聲明方式是將兩(liang)個字符串拼接(jie)(jie)起來(lai)。這(zhe)種(zhong)也是我們(men)接(jie)(jie)下(xia)來(lai)需(xu)要講到的問題。

我(wo)們說String是一個final的(de)(de)類。那么這樣的(de)(de)話(hua)

String s = "he"+"llo"+"world";

實際(ji)上是在堆上聲明(ming)了(le)兩個(ge)(ge)String對(dui)象(xiang)(xiang),s為"he"+"llo"的(de)(de)返回結果,當(dang)執行+"world"的(de)(de)時(shi)候(hou),又會(hui)聲明(ming)一個(ge)(ge)對(dui)象(xiang)(xiang),這個(ge)(ge)對(dui)象(xiang)(xiang)是“hello”+“world”的(de)(de)結果,當(dang)然,hello是會(hui)等著被(bei)GC回收的(de)(de),那么問題(ti)來了(le),GC不是隨時(shi)都在執行的(de)(de),當(dang)堆滿后(hou)就會(hui)觸發GC,如果沒滿,那么GC也只能當(dang)大(da)爺了(le),這樣我們的(de)(de)程序效(xiao)率(lv)就不是很高,眾多的(de)(de)辣雞對(dui)象(xiang)(xiang)不能被(bei)回收。

事(shi)實上(shang)執行(xing)這段語句的時候,被JVM隱式的創建了(le)一(yi)個StringBuilder 的對(dui)象,實際(ji)上(shang)執行(xing)的是

StringBuilder sb = new StringBuilder();
sb.append("he");
sb.append("llo");
sb.append("world");

“為什么會這么做?”
當然是為了(le)效率,StringBuilder在(zai)單個線(xian)程訪問的(de)時候相比StringBuffer是速度(du)最快的(de),而且也能避免垃圾對象的(de)問題。

posted @ 2016-10-16 17:43  浩大王  閱讀(372)  評論(0)    收藏  舉報