日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java核心之Java內(nèi)存分配原理(二)

JAVA內(nèi)存分配與管理是Java的核心技術(shù)之一,之前我們?cè)榻B過Java的內(nèi)存管理與內(nèi)存泄露以及Java垃圾回收方面的知識(shí),今天我們?cè)俅紊钊隞ava核心,詳細(xì)介紹一下Java在內(nèi)存分配方面的知識(shí)。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、保靖網(wǎng)絡(luò)推廣、小程序制作、保靖網(wǎng)絡(luò)營(yíng)銷、保靖企業(yè)策劃、保靖品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供保靖建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

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

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

 
 
  1. String a = "a1"; 
  2. String b = "a" + 1; 
  3. System.out.println((a == b)); //result = true 
  4. String a = "atrue"; 
  5. String b = "a" + "true"; 
  6. System.out.println((a == b)); //result = true 
  7. String a = "a3.4"; 
  8. String b = "a" + 3.4; 
  9. System.out.println((a == b)); //result = true 

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

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

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

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

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

 
 
  1. String a = "ab"; 
  2. final String bb = getBB(); 
  3. String b = "a" + bb; 
  4. System.out.println((a == b)); //result = false 
  5. private static String getBB() { 
  6. return "b"; 

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

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

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

就等價(jià)于

 
 
  1. String s = "abc"; 
  2. String a = "a"; 
  3. String b = "b"; 
  4. String c = "c"; 
  5. String s = a + b + c; 

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

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

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

 
 
  1. public class Test { 
  2. public static void main(String args[]) { 
  3. String s = null
  4. for(int i = 0; i < 100; i++) { 
  5. 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ì)象來進(jìn)行 append操作。

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

 
 
  1. public class Test4 { 
  2. private static String a = "ab"; 
  3. public static void main(String[] args){ 
  4. String s1 = "a"; 
  5. String s2 = "b"; 
  6. String s = s1 + s2; 
  7. System.out.println(s == a);//false 
  8. System.out.println(s.intern() == a);//true 

這里用到JAVA里面是一個(gè)常量池的問題。對(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的值相等。

總結(jié)

棧中用來存放一些原始數(shù)據(jù)類型的局部變量數(shù)據(jù)和對(duì)象的引用(String,數(shù)組.對(duì)象等等)但不存放對(duì)象內(nèi)容堆中存放使用new關(guān)鍵字創(chuàng)建的對(duì)象.字符串是一個(gè)特殊包裝類,其引用是存放在棧里的,而對(duì)象內(nèi)容必須根據(jù)創(chuàng)建方式不同定(常量池和堆).有的是編譯期就已經(jīng)創(chuàng)建好,存放在字符串常 量池中,而有的是運(yùn)行時(shí)才被創(chuàng)建.使用new關(guān)鍵字,存放在堆中。


新聞標(biāo)題:Java核心之Java內(nèi)存分配原理(二)
鏈接地址:http://www.dlmjj.cn/article/dpigpjp.html