欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

這篇文章主要介紹“Java字符串常量池和字面量賦值的簡(jiǎn)單介紹”,在日常操作中,相信很多人在Java字符串常量池和字面量賦值的簡(jiǎn)單介紹問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java字符串常量池和字面量賦值的簡(jiǎn)單介紹”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司長(zhǎng)期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為丹鳳企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),丹鳳網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

字符串常量池

之所以存在字符串常量池,主要是考慮到String字符串類型比八大基本類型更加復(fù)雜,并且使用的頻率也更加頻繁,經(jīng)常創(chuàng)建字符串對(duì)象會(huì)造成性能瓶頸,所以采用相似度機(jī)制,將字符串進(jìn)行復(fù)用(享元模式)。

在JDK 1.7 之后(包括1.7),字符串常量池已經(jīng)從方法區(qū)移到了堆中。

字面量賦值

String s1 = "古時(shí)的風(fēng)箏";

上面是字符串變量的最常用的方式,這種方式叫做字面量聲明,也就用把字符串用雙引號(hào)引起來,然后賦值給一個(gè)變量。這種情況下會(huì)直接將字符串放到字符串常量池中,然后返回給變量。

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

那這是我再聲明一個(gè)內(nèi)容相同的字符串,會(huì)發(fā)現(xiàn)字符串常量池中已經(jīng)存在了,那直接指向常量池中的地址即可。

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

例如上圖所示,聲明了 s1 和 s2,到最后都是指向同一個(gè)常量池的地址,所以 s1== s2 的結(jié)果是 true。

new String()方式

用 new String() 的方式,但是基本上不建議這么用,除非有特殊的邏輯需要。

String a = "古時(shí)的";
String s2 = new String(a + "風(fēng)箏");

使用這種方式聲明字符串變量的時(shí)候,會(huì)有兩種情況發(fā)生,

字符串常量池之前已經(jīng)存在相同字符串。

比如在使用 new 之前,已經(jīng)用字面量聲明的方式聲明了一個(gè)變量,此時(shí)字符串常量池中已經(jīng)存在了相同內(nèi)容的字符串常量。

  • 首先會(huì)在堆中創(chuàng)建一個(gè) s2 變量的對(duì)象引用;

  • 然后將這個(gè)對(duì)象引用指向字符串常量池中的已經(jīng)存在的常量;

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

字符串常量池中不存在相同內(nèi)容的常量

之前沒有任何地方用到了這個(gè)字符串,第一次聲明這個(gè)字符串就用的是 new String() 的方式,這種情況下會(huì)直接在堆中創(chuàng)建一個(gè)字符串對(duì)象然后返回給變量。

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

我看到好多地方說,如果字符串常量池中不存在的話,就先把字符串先放進(jìn)去,然后再引用字符串常量池的這個(gè)常量對(duì)象,這種說法是有問題的,只是 new String() 的話,如果池中沒有也不會(huì)放一份進(jìn)去

基于 new String() 的這種特性,我們可以得出一個(gè)結(jié)論:

String s1 = "古時(shí)的風(fēng)箏";
String a = "古時(shí)的";
String s2 = new String(a + "風(fēng)箏");
String s3 = new String(a + "風(fēng)箏");
System.out.println(s1==s2); // false
System.out.println(s2==s3);  // false

以上代碼,肯定輸出的都是 false,因?yàn)?new String() 不管你常量池中有沒有,我都會(huì)在堆中新建一個(gè)對(duì)象,新建出來的對(duì)象,當(dāng)然不會(huì)和其他對(duì)象相等。

intern() 池化

那什么時(shí)候會(huì)放到字符串常量池呢,就是在使用 intern() 方法之后。 intern() 的定義:

  • 如果當(dāng)前字符串內(nèi)容存在于字符串常量池,存在的條件是使用 equas() 方法為true,也就是內(nèi)容是一樣的,那直接返回此字符串在常量池的引用;

  • 如果之前不在字符串常量池中,那么在常量池創(chuàng)建一個(gè)引用并且指向堆中已存在的字符串,然后返回常量池中的地址。

第一種情況,準(zhǔn)備池化的字符串與字符串常量池中的字符串有相同(equas()判斷)

String s1 = "古時(shí)的風(fēng)箏";
String a = "古時(shí)的";
String s2 = new String(a + "風(fēng)箏");
s2 = s2.intern();

這個(gè)字符串常量已經(jīng)在常量池存在了,這時(shí),再 new 了一個(gè)新的對(duì)象 s2,并在堆中創(chuàng)建了一個(gè)相同字符串內(nèi)容的對(duì)象。

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

這時(shí),s1 == s2 會(huì)返回 fasle。然后我們調(diào)用 s2 = s2.intern(),將池化操作返回的結(jié)果賦值給 s2,就會(huì)發(fā)生如下的變化。

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

此時(shí),再次判斷 s1 == s2 ,就會(huì)返回 true,因?yàn)樗鼈兌贾赶蛄俗址A砍氐耐粋€(gè)字符串。

第二種情況,字符串常量池中不存在相同內(nèi)容的字符串

使用 new String() 在堆中創(chuàng)建了一個(gè)字符串對(duì)象

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

使用了intern()之后發(fā)生了什么呢,在常量池新增了一個(gè)對(duì)象,但是并沒有將字符串復(fù)制一份到常量池,而是直接指向了之前已經(jīng)存在于堆中的字符串對(duì)象。

因?yàn)樵?JDK 1.7 之后,字符串常量池不一定就是存字符串對(duì)象的,還有可能存儲(chǔ)的是一個(gè)指向堆中地址的引用,現(xiàn)在說的就是這種情況,注意了,下圖是只調(diào)用了 s2.intern(),并沒有返回給一個(gè)變量。其中字符串常量池(0x88)指向堆中字符串對(duì)象(0x99)就是intern() 的過程。

Java字符串常量池和字面量賦值的簡(jiǎn)單介紹

只有當(dāng)我們把 s2.intern() 的結(jié)果返回給 s2 時(shí),s2 才真正的指向字符串常量池。

   public static void main(String[] args) {
 		String s1 = "古時(shí)的風(fēng)箏";
		String s2 = "古時(shí)的風(fēng)箏";
		String a = "古時(shí)的";
		String s3 = new String(a + "風(fēng)箏");
		String s4 = new String(a + "風(fēng)箏");
	    System.out.println(s1 == s2); // 【1】 true
	    System.out.println(s2 == s3); // 【2】 false
	    System.out.println(s3 == s4); // 【3】 false
	    s3.intern();
	    System.out.println(s2 == s3); // 【4】 false
	    s3 = s3.intern();
	    System.out.println(s2 == s3); // 【5】 true
	    s4 = s4.intern();
	    System.out.println(s3 == s4); // 【6】 true
  }

  • ① 使用字符串直接量時(shí)會(huì)在常量池創(chuàng)建對(duì)象,當(dāng)然必須是常量折疊之后的。

  • ② 使用new String()時(shí),new產(chǎn)生的字符串對(duì)象是位于堆中,而不是常量池中。

  • ③ JDK7之后intern()發(fā)生過變化,現(xiàn)在如果常量池中不存在這個(gè)對(duì)像,不會(huì)復(fù)制到常量池中,而是簡(jiǎn)單的使用堆中已有字符串對(duì)象。

  • ④ JDK7以前的intern()不是這樣子的,以前會(huì)在常量池中創(chuàng)建一個(gè)新的對(duì)象,你可以將你的代碼,在JDK6中測(cè)試一下,結(jié)果應(yīng)該會(huì)不同。所以,你的問題不在new String()上,而是在intern()上,前者與常量池從來就沒有關(guān)系。

到此,關(guān)于“Java字符串常量池和字面量賦值的簡(jiǎn)單介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

當(dāng)前文章:Java字符串常量池和字面量賦值的簡(jiǎn)單介紹
分享地址:http://aaarwkj.com/article14/gjdpde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、云服務(wù)器、微信公眾號(hào)、網(wǎng)站導(dǎo)航、用戶體驗(yàn)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
久久这里只有精品视频六| 在线国产丝袜自拍观看| 蜜臀av在线播放黑丝| 日本在线观看高清区一区二| 久久精品国产亚洲熟女| 午夜麻豆影网在线观看| 亚洲一区二区三区熟女av| 秒播视频午夜福利在线观看| 91午夜福利偷拍视频| 国产精品国产一级国产av| 日韩人妻精品久久免费| 精华国产一区二区三区| 国产一区二区av免费| 日本久久久视频在线观看| 日韩午夜电影一区二区三区| av中文字幕在线激情| 亚洲成人福利免费网站| 国产麻豆91在线视频| 女同一区二区三区在线| 午夜在线免费观看小视频| 亚洲和欧洲一码二码区视频| 操老熟女一区二区三区| 国产传媒在线视频免费| 91麻豆精品在线观看| 香蕉欧美在线视频播放| 国产精品xxxx国产精品| 国产精品乱码中文字幕| 亚洲一区二区天堂av| 男女午夜激情四射视频| 国产亚洲精品视频在线| 国语自产精品视频在线不卡| 美女一区二区三区日本美女在线观看| 日本不卡一区二区在线观看 | 国产熟女av一区二区| 日韩一级黄色片在线播放| 亚洲国产欧美日韩在线不卡成人| 日本精品动漫一区二区三区| 日本加勒比一本在线观看| 中文字幕亚洲欧美日韩高清| 亚州精品乱码久久电影| 国产一区二区三区在线精品专区|