国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

java String的intern方法

2019-11-26 14:03:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

首先我們應(yīng)該清楚的是JDK1.6和JDK1.7中String類的intern方法還是有差別的: 

 JDK1.6中的intern:   

調(diào)用intern方法的時(shí)候首先會(huì)去常量池中查看是否存在與當(dāng)前String值相同的值,如果存在的話,則直接返回常量池中這個(gè)String值的引用;如果不存在的話,則會(huì)將原先堆中的該字符串拷貝一份到常量池中。  

JDK1.7中的intern:   

調(diào)用intern方法的時(shí)候首先會(huì)去常量池中查看是否存在與當(dāng)前String值相同的值,如果存在的話,則直接返回常量池中這個(gè)String值的引用;如果不存在的話,則只會(huì)將原先堆中該字符串的引用放置在常量池中,并不會(huì)將拷貝整個(gè)字符串到常量池中。   

這也就說(shuō)明,JDK1.6和JDK1.7對(duì)于常量池中不存在此字符串的情況處理不同。    

下面通過(guò)實(shí)例來(lái)進(jìn)行驗(yàn)證和解釋:      

實(shí)例:

public static void main(String[] args) {   String str = "str"+new String("01");①   str.intern();②   String str1 = "str01";③   System.out.println(str == str1);      String str2 = new String("str01");④   str2.intern();⑤   String str3 = "str01";⑥   System.out.println(str2 == str3);      String str4 = "str01";⑦   String str5 = new String("str")+new String("01");⑧   str5.intern();⑨   System.out.println(str4 == str5); 

在JDK1.6下輸出結(jié)果是:

false
false
false

解釋:

①執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str,同時(shí)在常量池創(chuàng)建一個(gè)"str"以及"01"常量;

②執(zhí)行時(shí)會(huì)首先去常量池中查看是否存在一個(gè)值為"str01"的常量,發(fā)現(xiàn)不存在,JDK1.6的做法就是將該字符串"str01"在常量池中也生成一份;

③執(zhí)行時(shí)會(huì)在常量池中創(chuàng)建一個(gè)"str01"對(duì)象,發(fā)現(xiàn)已經(jīng)存在,因而不會(huì)新建;
第一個(gè)輸出false的原因是:str指向的是堆內(nèi)存的"str01",而str1指向的是常量池中的"str01";

④執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str2,同時(shí)在常量池中創(chuàng)建一個(gè)值為"str01"的常量;

⑤執(zhí)行時(shí)會(huì)首先去常量池中查看是否存在值為"str01"的常量,發(fā)現(xiàn)存在,則直接返回這個(gè)常量引用;

⑥執(zhí)行時(shí)會(huì)在常量池中創(chuàng)建一個(gè)值為"str01"的常量,如果發(fā)現(xiàn)已經(jīng)存在,則不會(huì)創(chuàng)建;

第二個(gè)輸出false的原因是:str2指向的是堆內(nèi)存的"str01",而str3指向的是常量池中的"str01";

⑦執(zhí)行時(shí)會(huì)在常量池創(chuàng)建一個(gè)值為"str01"的常量;

⑧執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str5,同時(shí)在常量池創(chuàng)建一個(gè)"str"以及"01"常量;

⑨執(zhí)行時(shí)會(huì)去常量池查看是否存在值為"str01"的常量,發(fā)現(xiàn)存在則直接返回這個(gè)常量引用;
第三個(gè)輸出false的原因是:str5指向的是堆內(nèi)存的"str01",而str4指向的是常量池中的"str01";

在JDK1.7下輸出結(jié)果是:

true
false
false

解釋:

發(fā)現(xiàn)只有第一個(gè)輸出結(jié)果不一樣,所以我們只解釋第一個(gè)的原因:

①執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str,同時(shí)在常量池創(chuàng)建一個(gè)"str"以及"01"常量;(這點(diǎn)和JDK1.6沒(méi)什么區(qū)別)

②執(zhí)行時(shí)會(huì)首先去常量池中查看是否存在一個(gè)值為"str01"的常量,發(fā)現(xiàn)不存在,JDK1.7的做法就是將堆內(nèi)存中"str01"的引用復(fù)制到了常量池中;

③執(zhí)行時(shí)會(huì)在常量池中創(chuàng)建一個(gè)"str01"對(duì)象,發(fā)現(xiàn)已經(jīng)存在,因而不會(huì)新建;
那么此時(shí)的str和str1都將指向的是堆內(nèi)存中的"str01"的值,所以兩者相等;

以上就是對(duì)JDK1.6和JDK1.7中String類的intern方法的對(duì)比,是有差別的,有需要的朋友可以參考下。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 房山区| 驻马店市| 乌拉特后旗| 宣城市| 上栗县| 吉木萨尔县| 建昌县| 札达县| 高邮市| 微山县| 库伦旗| 买车| 乐都县| 黄陵县| 凭祥市| 田东县| 长丰县| 小金县| 朝阳区| 静安区| 论坛| 深州市| 宝丰县| 阿瓦提县| 垦利县| 汕尾市| 义马市| 定西市| 鄂州市| 许昌县| 常宁市| 双牌县| 胶州市| 阳泉市| 曲阳县| 青州市| 浏阳市| 都昌县| 湖州市| 东丰县| 德化县|