卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

字符串常量池在堆中還是方法區(qū) 字符串常量池到底存放的是字符串引用還是字符串對(duì)象?

字符串常量池到底存放的是字符串引用還是字符串對(duì)象?你看看String源碼就明白了,是對(duì)象!s="123"寫(xiě)這句話(huà)的時(shí)候,會(huì)在常量池先找有沒(méi)有123這個(gè)字符串對(duì)象如果沒(méi)有,他就開(kāi)始抽取,1,2,3然后拼

字符串常量池到底存放的是字符串引用還是字符串對(duì)象?

你看看String源碼就明白了,是對(duì)象!

s="123"

寫(xiě)這句話(huà)的時(shí)候,會(huì)在常量池先找有沒(méi)有123這個(gè)字符串對(duì)象如果沒(méi)有,他就開(kāi)始抽取,1,2,3

然后拼接成一個(gè)對(duì)象即:"123"

假如后面又來(lái)一個(gè)也需要這個(gè)對(duì)象,比如說(shuō)s1="123"

這個(gè)時(shí)候在操作s1的時(shí)候還是先去常量池找有沒(méi)有這個(gè)對(duì)象,如果有,直接把地址拿過(guò)來(lái),因?yàn)槌A砍財(cái)?shù)據(jù)為共享的,

假如這個(gè)時(shí)候s1="1234"那么常量池是沒(méi)有的,就會(huì)重新抽取,1,2,3,4,然后重新拼接成一個(gè)新的對(duì)象放在常量池!

String源碼里面有一個(gè)私有變量一個(gè)字符類(lèi)型的數(shù)組,他就是用來(lái)抽取這些單個(gè)字符,然后拼接成

一個(gè)字符串對(duì)象!

字符串常量池是在方法區(qū)中還是在獨(dú)立的區(qū)域中?

String str = "nihao" 程序開(kāi)始執(zhí)行這句代碼,肯定是要?jiǎng)?chuàng)建一個(gè)對(duì)象的, 只是這個(gè)對(duì)象創(chuàng)建后就是一個(gè)常量,不可以更改, 并且這個(gè)對(duì)象是放在串池里面的,也就是你說(shuō)的那個(gè)常量池

如果我后面在寫(xiě)一句代碼: String other = "nihao"

str和other這2個(gè)引用的地址就是一樣的, 因?yàn)閟tr和other的聲明方式是一樣的, 都是在串池, str的對(duì)象創(chuàng)建時(shí),串池中沒(méi)有"nihao"這個(gè)常量,就創(chuàng)建一個(gè). other對(duì)象創(chuàng)建時(shí),發(fā)現(xiàn)串池中已經(jīng)有了"nihao"這個(gè)常量, 就直接拿過(guò)來(lái)用就是了

String a1 = new String("nihao")

String b1 = new String("nihao")

但是如果我們通過(guò)上面的方式直接new String() 那個(gè)a1和b1這2個(gè)引用的對(duì)象就不是在串池中了,而是在堆中, 但是new String() 的參數(shù)"nihao"也是一個(gè)字符串啊, 這個(gè)字符串從哪里來(lái)呢?如果我們吧代碼拆分一下就明白了:

String para = "nihao"

String a1 = new String(para)

就會(huì)發(fā)現(xiàn)String a1 = new String("nihao") 這一句代碼實(shí)際上創(chuàng)建了2個(gè)對(duì)象, 一個(gè)是String對(duì)象,存放在堆中, 一個(gè)是字符串常量對(duì)象,存放在串池中

字符常量池是什么意思?

可以理解為內(nèi)存里面專(zhuān)門(mén)為string類(lèi)型變量開(kāi)辟的一片區(qū)域譬如String a = "abc" 當(dāng)你定義這樣一個(gè)變量的時(shí)候,java此時(shí)先會(huì)去常量池尋找有沒(méi)有"abc"這樣的字符串,如果有,直接把內(nèi)存地址交給a, 否則就生成一個(gè)"abc"的字符串當(dāng)下一個(gè)String b = "abc"的時(shí)候,發(fā)現(xiàn)常量池已經(jīng)有"abc"了,此時(shí)JVM不會(huì)再次生成"abc",而是直接交給"abc"引用給b, 所以此時(shí)你會(huì)發(fā)現(xiàn)a == b

Java中的字符串常量池與Java中的堆和棧的區(qū)別?

java常量池不在堆中也不在棧中,是獨(dú)立的內(nèi)存空間管理。

 1. 棧:存放基本類(lèi)型的變量數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆(new 出來(lái)的對(duì)象)或者常量池中(字符串常量對(duì)象存放在常量池中。)

 2. 堆:存放所有new出來(lái)的對(duì)象。

 3. 常量池:存放字符串常量和基本類(lèi)型常量(public static final)。

對(duì)于字符串:其對(duì)象的引用都是存儲(chǔ)在棧中的,如果是編譯期已經(jīng)創(chuàng)建好(直接用雙引號(hào)定義的)的就存儲(chǔ)在常量池中,如果是運(yùn)行期(new出來(lái)的)才能確定的就存儲(chǔ)在堆中。對(duì)于equals相等的字符串,在常量池中永遠(yuǎn)只有一份,在堆中有多份。