久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Java知識(shí)點(diǎn):String s=new String("xyz")中到底有幾個(gè)對象?

Java知識(shí)點(diǎn):String s=new String("xyz")中到底有幾個(gè)對象?

來源:千鋒教育
發(fā)布人:wjy
時(shí)間: 2022-07-01 17:09:00 1656666540

  掌握了關(guān)于Java內(nèi)存的基礎(chǔ)知識(shí)之后,我們就可以對這個(gè)面試題有更深入的理解了。

  1. 案例代碼

  我們先編寫面試題中涉及到的代碼,如下所示:

java知識(shí)點(diǎn)java面試題1

  代碼很簡單,就一行代碼!那么問題來了,這行代碼中共有幾個(gè)對象呢?1個(gè)?2個(gè)?還是3個(gè)?要想弄明白到底有幾個(gè)對象,壹哥 就給大家把這段代碼的內(nèi)存分區(qū)繪制了一下(本案例開發(fā)環(huán)境是基于JDK8)。

  2. 內(nèi)存分配(重點(diǎn))

  在 String s = new String("xyz"); 這行代碼中,s是String類型的變量,不是對象!‘xyz’是字符串對象,new String("xyz")也是一個(gè)對象,那么它們幾個(gè)的內(nèi)存劃分在JDK8的環(huán)境中,如下圖所示:

java知識(shí)點(diǎn)java面試題12

  那么根據(jù)上圖,壹哥 就可以為各位給出本題的答案了,請仔細(xì)咯,重點(diǎn)來啦,內(nèi)存分配過程如下:

  當(dāng)JVM在編譯階段加載讀取到“xyz”的時(shí)候,首先會(huì)檢查堆中的String常量池,也就是常量緩沖區(qū),檢查是否已經(jīng)有了"xyz"常量對象,如果有,則不會(huì)再次創(chuàng)建"xyz"常量對象,并直接返回該字符串的引用地址;如果沒有,則創(chuàng)建一個(gè)"xyz"常量對象,并為該對象分配一個(gè)內(nèi)存地址002返回。

  當(dāng)JVM在運(yùn)行階段加載讀取到new關(guān)鍵字的時(shí)候,JVM會(huì)在堆中為其創(chuàng)建一個(gè)對象,即new String(),并為其分配內(nèi)存地址001,而堆中這個(gè)對象的內(nèi)容是上面"xyz"常量對象的引用地址002,換句話說這個(gè)堆中存的就是常量池中"xyz"的引用地址002。

  最后,s 是對當(dāng)前堆中001號(hào)對象的一個(gè)地址引用,s本身不是一個(gè)對象,s只是一個(gè)String類型的變量而已!

  3. 變量與對象

  我們還需要弄明白一個(gè)問題,即變量與對象的區(qū)別。請問在 String s=new String("xyz");這行代碼中,s是對象嗎?

  String類中有一種創(chuàng)建對象的特殊形式,就是可以使用 ""雙引號(hào) 來創(chuàng)建對象,這種創(chuàng)建方式可以在一定程度上提高程序的運(yùn)行速度,因?yàn)镴VM會(huì)自動(dòng)根據(jù)常量池中的數(shù)據(jù)存在實(shí)際情況來決定是否有必要?jiǎng)?chuàng)建新對象。在String s=new String("xyz")中,實(shí)際創(chuàng)建了2個(gè)String對象,一個(gè)是通過""雙引號(hào),在編譯期創(chuàng)建的"xyz"常量對象;另一個(gè)是通過new String(),在運(yùn)行期創(chuàng)建的。

  但是 s 只是一個(gè)String類型的變量,不是對象,它只是對字符串對象的一個(gè)引用而已。所謂的對象,應(yīng)該是需要在堆中分配了內(nèi)存的類型才能叫做對象,s位于棧中,所以不是對象!

  4. 問題答案(重點(diǎn))

  所以String s=new String("xyz")這行代碼中究竟有幾個(gè)對象,我們的答案要分兩種情況來考慮:

  ●如果String常量池中已經(jīng)有了"xyz"常量對象,那么答案就是只創(chuàng)建了一個(gè)對象,即new String();

  ●如果String常量池中沒有創(chuàng)建"xyz"常量對象,則會(huì)創(chuàng)建兩個(gè)對象,即一個(gè)"xyz"常量對象,一個(gè)new String()對象。

  更多關(guān)于“Java培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專業(yè),有針對零基礎(chǔ)的就業(yè)班,有針對想提升技術(shù)的好程序員班,高品質(zhì)課程助力你實(shí)現(xiàn)java程序員夢想。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
什么是PlatformIo?

PlatformIO是什么PlatformIO是一個(gè)全面的物聯(lián)網(wǎng)開發(fā)平臺(tái),它為眾多硬件平臺(tái)和開發(fā)環(huán)境提供了統(tǒng)一的工作流程,有效簡化了開發(fā)過程,并能兼容各種...詳情>>

2023-10-14 12:55:06
云快照與自動(dòng)備份有什么區(qū)別?

1、定義和目標(biāo)不同云快照的主要目標(biāo)是提供一種快速恢復(fù)數(shù)據(jù)的方法,它只記錄在快照時(shí)間點(diǎn)后的數(shù)據(jù)變化,而不是所有的數(shù)據(jù)。自動(dòng)備份的主要目標(biāo)...詳情>>

2023-10-14 12:48:59
服務(wù)器為什么要用Linux?

服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨(dú)特的優(yōu)勢和特點(diǎn)。包括其...詳情>>

2023-10-14 12:34:11
ORM解決的主要問題是什么?

ORM(對象關(guān)系映射)解決的主要問題是將關(guān)系數(shù)據(jù)庫與面向?qū)ο缶幊讨g的映射困境。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)以表格的形式存儲(chǔ),而在面向?qū)ο?..詳情>>

2023-10-14 12:26:19
Go為什么不支持三元運(yùn)算符?

Go為什么不支持三元運(yùn)算符Go語言是一種以簡潔和有效性為目標(biāo)的編程語言,因此在設(shè)計(jì)過程中,Go的設(shè)計(jì)者刻意排除了一些他們認(rèn)為可能導(dǎo)致復(fù)雜性或...詳情>>

2023-10-14 12:12:36