真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java內(nèi)存分配原理是什么

本篇內(nèi)容介紹了“Java內(nèi)存分配原理是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目前成都創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、開(kāi)化網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

String常量池問(wèn)題的幾個(gè)例子

下面是幾個(gè)常見(jiàn)例子的比較分析和理解:

String a = "a1";   String b = "a" + 1;   System.out.println((a == b)); //result = true   String a = "atrue";   String b = "a" + "true";   System.out.println((a == b)); //result = true   String a = "a3.4";   String b = "a" + 3.4;   System.out.println((a == b)); //result = true

分析:JVM對(duì)于字符串常量的"+"號(hào)連接,將程序編譯期,JVM就將常量字符串的"+"連接優(yōu)化為連接后的值,拿"a" + 1來(lái)說(shuō),經(jīng)編譯器優(yōu)化后在class中就已經(jīng)是a1。在編譯期其字符串常量的值就確定下來(lái),故上面程序最終的結(jié)果都為true。

String a = "ab";   String bb = "b";   String b = "a" + bb;   System.out.println((a == b)); //result = false

分析:JVM對(duì)于字符串引用,由于在字符串的"+"連接中,有字符串引用存在,而引用的值在程序編譯期是無(wú)法確定的,即"a" + bb無(wú)法被編譯器優(yōu)化,只有在程序運(yùn)行期來(lái)動(dòng)態(tài)分配并將連接后的新地址賦給b。所以上面程序的結(jié)果也就為false。

String a = "ab";   final String bb = "b";   String b = "a" + bb;   System.out.println((a == b)); //result = true

分析:和[3]中***不同的是bb字符串加了final修飾,對(duì)于final修飾的變量,它在編譯時(shí)被解析為常量值的一個(gè)本地拷貝存儲(chǔ)到自己的常量 池中或嵌入到它的字節(jié)碼流中。所以此時(shí)的"a" + bb和"a" + "b"效果是一樣的。故上面程序的結(jié)果為true。

String a = "ab";   final String bb = getBB();   String b = "a" + bb;   System.out.println((a == b)); //result = false   private static String getBB() {   return "b";   }

分析:JVM對(duì)于字符串引用bb,它的值在編譯期無(wú)法確定,只有在程序運(yùn)行期調(diào)用方法后,將方法的返回值和"a"來(lái)動(dòng)態(tài)連接并分配地址為b,故上面 程序的結(jié)果為false。

通過(guò)上面4個(gè)例子可以得出得知:

String s = "a" + "b" + "c";

就等價(jià)于

String s = "abc";   String a = "a";   String b = "b";   String c = "c";   String s = a + b + c;

這個(gè)就不一樣了,最終結(jié)果等于:

StringBuffer temp = new StringBuffer();   temp.append(a).append(b).append(c);   String s = temp.toString();

由上面的分析結(jié)果,可就不難推斷出String 采用連接運(yùn)算符(+)效率低下原因分析,形如這樣的代碼:

public class Test {   public static void main(String args[]) {   String s = null;   for(int i = 0; i < 100; i++) {   s += "a";   }   }   }

每做一次 + 就產(chǎn)生個(gè)StringBuilder對(duì)象,然后append后就扔掉。下次循環(huán)再到達(dá)時(shí)重新產(chǎn)生個(gè)StringBuilder對(duì)象,然后 append 字符串,如此循環(huán)直至結(jié)束。如果我們直接采用 StringBuilder 對(duì)象進(jìn)行 append 的話,我們可以節(jié)省 N - 1 次創(chuàng)建和銷毀對(duì)象的時(shí)間。所以對(duì)于在循環(huán)中要進(jìn)行字符串連接的應(yīng)用,一般都是用StringBuffer或StringBulider對(duì)象來(lái)進(jìn)行 append操作。

String對(duì)象的intern方法理解和分析:

public class Test4 {   private static String a = "ab";   public static void main(String[] args){   String s1 = "a";   String s2 = "b";   String s = s1 + s2;   System.out.println(s == a);//false   System.out.println(s.intern() == a);//true   }   }

這里用到JAVA里面是一個(gè)常量池的問(wèn)題。對(duì)于s1+s2操作,其實(shí)是在堆里面重新創(chuàng)建了一個(gè)新的對(duì)象,s保存的是這個(gè)新對(duì)象在堆空間的的內(nèi)容,所 以s與a的值是不相等的。而當(dāng)調(diào)用s.intern()方法,卻可以返回s在常量池中的地址值,因?yàn)閍的值存儲(chǔ)在常量池中,故s.intern和a的值相等。

“Java內(nèi)存分配原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


分享標(biāo)題:Java內(nèi)存分配原理是什么
URL標(biāo)題:http://weahome.cn/article/psdgpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部