摘要:編譯器發(fā)生了什么通過查看文件可以知道在編譯的過程中間就將加直接處理成了但是如果是這樣查看文件可以看出是而且可以看到表示在棧內存生成了一個引用變量指向堆內存的。
package com.spring; public class Day01 { public static void main(String[] args) { String b="aa"+"bb"; } }
String b="aa"+"bb"編譯器發(fā)生了什么?
通過查看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 }
在編譯的過程中間就將加直接處理成了"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]表示在棧內存生成了一個引用變量指向堆內存的"bb"。而"aa"則沒有引用變量指向。(可以查看JAVA指令集了解這些內容)
非常量字會串相加時,由于相加的變量中存放的是字符串的地址引用,
因為在編譯時無法確切地知道其他具體的值,也就沒有辦法對其進行優(yōu)化處理,這時為了
達到連接的效果,其內部采用了 StringBuffer 的機制進行處理。
堆內存java虛擬機可以直接使用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/64345.html
摘要:因此,這三個類是各有利弊,應當根據(jù)不同的情況來進行選擇使用當字符串相加操作或者改動較少的情況下,建議使用這種形式當字符串相加操作較多的情況下,建議使用,如果采用了多線程,則使用。 1.包裝類與自動拆箱裝箱 int a1= 1000;int a2=1000;if(a1==a2){System.out.println(yes);} ==的比較,基本數(shù)據(jù)類型看的是值是否相等,引用數(shù)據(jù)類型...
摘要:在本文,筆者將與大家概覽的體系結構與工作方式。將第條和第條指令分別是將兩個局部變量入棧,然后相加。最后一條指令是,這條指令執(zhí)行完后當前的這個方法對應的這些部件會被回收,局部變量區(qū)的所有值將全部釋放,寄存器會被銷魂,在棧中與這個方 Java之所以號稱一次編譯,到處運行,主要原因是JVM屏蔽了各個計算機平臺相關的軟件(大多指系統(tǒng))或者硬件之間的差異,使得與平臺相關的耦合統(tǒng)一由JVM提供者來...
摘要:而所有的數(shù)據(jù)運算都是采用補碼進行的。補碼解決負數(shù)加法運算正負零問題,彌補了反碼的不足。通過使用訪問修飾符可以使實例變量對子類可見暫時在學習基礎語法知識的時候可以暫時忽略實例變量這部分內容,這部分內容主要被使用在面向對象的部分,但是極其重要。 showImg(https://segmentfault.com/img/remote/1460000019264541?w=600&h=242)...
摘要:經典的基礎面試題集錦經典的基礎面試題集錦,歡迎收藏和分享。類變量或者說靜態(tài)變量是通過這個關鍵字來聲明的。非靜態(tài)變量在每一個對象實例上都有單獨的一份值。對象允許程序和數(shù)據(jù)進行封裝,以減少潛在的干涉。 經典的Java基礎面試題集錦 經典的Java基礎面試題集錦,歡迎收藏和分享。 問題:如果main方法被聲明為private會怎樣? 答案:能正常編譯,但運行的時候會提示main方法不是pub...
摘要:所以就想把一大串縮短點,將二進制中的三位用一位表示。以可以大寫也可以小寫開頭版本可以表示二進制了八進制的數(shù)據(jù)表現(xiàn)形式由組成。結果把系數(shù)基數(shù)的權次冪相加即可。因為語言采用的是碼來編碼的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序執(zhí)行的過程中其值不可以發(fā)生改變 B:Java中常量的分類 字面值常量 自定義常量(面向對象部分講) C:字面值常量的...
閱讀 2957·2021-10-08 10:12
閱讀 4058·2021-09-22 15:45
閱讀 2627·2019-08-30 15:52
閱讀 2698·2019-08-29 18:44
閱讀 2707·2019-08-29 12:37
閱讀 1229·2019-08-26 13:36
閱讀 2624·2019-08-26 13:34
閱讀 1539·2019-08-26 12:20