摘要:編譯器發(fā)生了什么通過(guò)查看文件可以知道在編譯的過(guò)程中間就將加直接處理成了但是如果是這樣查看文件可以看出是而且可以看到表示在棧內(nèi)存生成了一個(gè)引用變量指向堆內(nèi)存的。
package com.spring; public class Day01 { public static void main(String[] args) { String b="aa"+"bb"; } }
String b="aa"+"bb"編譯器發(fā)生了什么?
通過(guò)查看class文件可以知道:
// Compiled from Day01.java (version 1.5 : 49.0, super bit) public class com.spring.Day01 { // Method descriptor #6 ()V // Stack: 1, Locals: 1 public Day01(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [8] 4 return Line numbers: [pc: 0, line: 10] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.spring.Day01 // Method descriptor #15 ([Ljava/lang/String;)V // Stack: 1, Locals: 2 public static void main(java.lang.String[] args); 0 ldc[16] 2 astore_1 [b] 3 return Line numbers: [pc: 0, line: 17] [pc: 3, line: 19] Local variable table: [pc: 0, pc: 4] local: args index: 0 type: java.lang.String[] [pc: 3, pc: 4] local: b index: 1 type: java.lang.String }
在編譯的過(guò)程中間就將加直接處理成了"aabb";
但是如果是這樣:
package com.spring; public class Day01 { public static void main(String[] args) { String b="bb"; String c ="aa"+b; } }
查看class文件:
// Compiled from Day01.java (version 1.5 : 49.0, super bit) public class com.spring.Day01 { // Method descriptor #6 ()V // Stack: 1, Locals: 1 public Day01(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [8] 4 return Line numbers: [pc: 0, line: 10] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.spring.Day01 // Method descriptor #15 ([Ljava/lang/String;)V // Stack: 3, Locals: 3 public static void main(java.lang.String[] args); 0 ldc[16] 2 astore_1 [b] 3 new java.lang.StringBuilder [18] 6 dup 7 ldc [20] 9 invokespecial java.lang.StringBuilder(java.lang.String) [22] 12 aload_1 [b] 13 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25] 16 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [29] 19 astore_2 [c] 20 return Line numbers: [pc: 0, line: 16] [pc: 3, line: 17] [pc: 20, line: 19] Local variable table: [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[] [pc: 3, pc: 21] local: b index: 1 type: java.lang.String [pc: 20, pc: 21] local: c index: 2 type: java.lang.String }
可以看出是new StringBuffer("aa").append("bb").toString();
而且可以看到astore_1 [b]表示在棧內(nèi)存生成了一個(gè)引用變量指向堆內(nèi)存的"bb"。而"aa"則沒(méi)有引用變量指向。(可以查看JAVA指令集了解這些內(nèi)容)
非常量字會(huì)串相加時(shí),由于相加的變量中存放的是字符串的地址引用,
因?yàn)樵诰幾g時(shí)無(wú)法確切地知道其他具體的值,也就沒(méi)有辦法對(duì)其進(jìn)行優(yōu)化處理,這時(shí)為了
達(dá)到連接的效果,其內(nèi)部采用了 StringBuffer 的機(jī)制進(jìn)行處理。
堆內(nèi)存java虛擬機(jī)可以直接使用。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64345.html
摘要:因此,這三個(gè)類(lèi)是各有利弊,應(yīng)當(dāng)根據(jù)不同的情況來(lái)進(jìn)行選擇使用當(dāng)字符串相加操作或者改動(dòng)較少的情況下,建議使用這種形式當(dāng)字符串相加操作較多的情況下,建議使用,如果采用了多線程,則使用。 1.包裝類(lèi)與自動(dòng)拆箱裝箱 int a1= 1000;int a2=1000;if(a1==a2){System.out.println(yes);} ==的比較,基本數(shù)據(jù)類(lèi)型看的是值是否相等,引用數(shù)據(jù)類(lèi)型...
摘要:在本文,筆者將與大家概覽的體系結(jié)構(gòu)與工作方式。將第條和第條指令分別是將兩個(gè)局部變量入棧,然后相加。最后一條指令是,這條指令執(zhí)行完后當(dāng)前的這個(gè)方法對(duì)應(yīng)的這些部件會(huì)被回收,局部變量區(qū)的所有值將全部釋放,寄存器會(huì)被銷(xiāo)魂,在棧中與這個(gè)方 Java之所以號(hào)稱(chēng)一次編譯,到處運(yùn)行,主要原因是JVM屏蔽了各個(gè)計(jì)算機(jī)平臺(tái)相關(guān)的軟件(大多指系統(tǒng))或者硬件之間的差異,使得與平臺(tái)相關(guān)的耦合統(tǒng)一由JVM提供者來(lái)...
摘要:而所有的數(shù)據(jù)運(yùn)算都是采用補(bǔ)碼進(jìn)行的。補(bǔ)碼解決負(fù)數(shù)加法運(yùn)算正負(fù)零問(wèn)題,彌補(bǔ)了反碼的不足。通過(guò)使用訪問(wèn)修飾符可以使實(shí)例變量對(duì)子類(lèi)可見(jiàn)暫時(shí)在學(xué)習(xí)基礎(chǔ)語(yǔ)法知識(shí)的時(shí)候可以暫時(shí)忽略實(shí)例變量這部分內(nèi)容,這部分內(nèi)容主要被使用在面向?qū)ο蟮牟糠?,但是極其重要。 showImg(https://segmentfault.com/img/remote/1460000019264541?w=600&h=242)...
摘要:經(jīng)典的基礎(chǔ)面試題集錦經(jīng)典的基礎(chǔ)面試題集錦,歡迎收藏和分享。類(lèi)變量或者說(shuō)靜態(tài)變量是通過(guò)這個(gè)關(guān)鍵字來(lái)聲明的。非靜態(tài)變量在每一個(gè)對(duì)象實(shí)例上都有單獨(dú)的一份值。對(duì)象允許程序和數(shù)據(jù)進(jìn)行封裝,以減少潛在的干涉。 經(jīng)典的Java基礎(chǔ)面試題集錦 經(jīng)典的Java基礎(chǔ)面試題集錦,歡迎收藏和分享。 問(wèn)題:如果main方法被聲明為private會(huì)怎樣? 答案:能正常編譯,但運(yùn)行的時(shí)候會(huì)提示main方法不是pub...
摘要:所以就想把一大串縮短點(diǎn),將二進(jìn)制中的三位用一位表示。以可以大寫(xiě)也可以小寫(xiě)開(kāi)頭版本可以表示二進(jìn)制了八進(jìn)制的數(shù)據(jù)表現(xiàn)形式由組成。結(jié)果把系數(shù)基數(shù)的權(quán)次冪相加即可。因?yàn)檎Z(yǔ)言采用的是碼來(lái)編碼的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序執(zhí)行的過(guò)程中其值不可以發(fā)生改變 B:Java中常量的分類(lèi) 字面值常量 自定義常量(面向?qū)ο蟛糠种v) C:字面值常量的...
閱讀 2865·2021-10-08 10:12
閱讀 3966·2021-09-22 15:45
閱讀 2555·2019-08-30 15:52
閱讀 2625·2019-08-29 18:44
閱讀 2643·2019-08-29 12:37
閱讀 1153·2019-08-26 13:36
閱讀 2560·2019-08-26 13:34
閱讀 1472·2019-08-26 12:20