日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一個(gè)關(guān)于Java字符串對(duì)象問(wèn)題的詳細(xì)解答

今天下班的路上,看到有人問(wèn)這樣一個(gè)問(wèn)題:

我看到這個(gè)問(wèn)題的第一眼也有點(diǎn)懵。

但如果把問(wèn)題換成以下代碼,答案對(duì)于我來(lái)說(shuō)還是非常清晰的。

 
 
 
 
  1. String str = "test" + "1"; 

但是當(dāng)一個(gè)字符串和一個(gè)整數(shù)相加時(shí),會(huì)創(chuàng)建幾個(gè)對(duì)象呢?

作為老司機(jī),深知實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),動(dòng)手才是硬道理。

代碼清單如下:

 
 
 
 
  1. public class Hello { 
  2.   public static void main(String[] args) { 
  3.     String str = "test" + 1; 
  4.     System.out.println(str); 
  5.   } 

編譯以上代碼,執(zhí)行,控制臺(tái)輸出沒(méi)有任何異議。

要看到創(chuàng)建了幾個(gè)對(duì)象,我們需要反編譯 Hello.class 文件,得到 java 字節(jié)碼指令。

看到 main 方法的字節(jié)碼指令,一切已經(jīng)真相大白。

其實(shí),作為一個(gè)老司機(jī),早就應(yīng)該想到是這樣的結(jié)果。

可是,面對(duì)這樣一道面試題,竟然還是還是蒙圈了。

那我們來(lái)解釋一下 main 方法的第一條字節(jié)碼指令。

 
 
 
 
  1. 0: ldc       
  • ldc 的意思是 LoaD Constant,即從常量池中加載一個(gè)常量并壓入(push)到操作數(shù)棧(operand stack)。
  • #2 是常量池中索引,表示常量池中的第2項(xiàng)。

關(guān)于 ldc 字節(jié)碼指令的詳細(xì)說(shuō)明,請(qǐng)參考官方文檔,連接地址為:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.ldc。

常量池中的第2個(gè)常量到底是什么,我們還需要使用 javap 命令來(lái)獲得。

 
 
 
 
  1. C:\Users\Thinkpad\Desktop>javap -v Hello.class 
  2. Classfile /C:/Users/Thinkpad/Desktop/Hello.class 
  3.   Last modified 2021-8-12; size 415 bytes 
  4.   MD5 checksum d350245a83d24798f2269149002970f5 
  5.   Compiled from "Hello.java" 
  6. public class Hello 
  7.   minor version: 0 
  8.   major version: 52 
  9.   flags: ACC_PUBLIC, ACC_SUPER 
  10. Constant pool: 
  11.    #1 = Methodref          #6.#15         // java/lang/Object."":()V 
  12.    #2 = String             #16            // test1 
  13.    #3 = Fieldref           #17.#18        // java/lang/System.out:Ljava/io/PrintStream; 
  14.    #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V 
  15.    #5 = Class              #21            // Hello 
  16.    #6 = Class              #22            // java/lang/Object 
  17.    #7 = Utf8                
  18.    #8 = Utf8               ()V 
  19.    #9 = Utf8               Code 
  20.   #10 = Utf8               LineNumberTable 
  21.   #11 = Utf8               main 
  22.   #12 = Utf8               ([Ljava/lang/String;)V 
  23.   #13 = Utf8               SourceFile 
  24.   #14 = Utf8               Hello.java 
  25.   #15 = NameAndType        #7:#8          // "":()V 
  26.   #16 = Utf8               test1 
  27.   #17 = Class              #23            // java/lang/System 
  28.   #18 = NameAndType        #24:#25        // out:Ljava/io/PrintStream; 
  29.   #19 = Class              #26            // java/io/PrintStream 
  30.   #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V 
  31.   #21 = Utf8               Hello 
  32.   #22 = Utf8               java/lang/Object 
  33.   #23 = Utf8               java/lang/System 
  34.   #24 = Utf8               out 
  35.   #25 = Utf8               Ljava/io/PrintStream; 
  36.   #26 = Utf8               java/io/PrintStream 
  37.   #27 = Utf8               println 
  38.   #28 = Utf8               (Ljava/lang/String;)V 

我們看到常量池(Constant pool)的第二項(xiàng)是:test1。

也就是說(shuō),javac 在編譯代碼過(guò)程中知道:

  • 字符串 "test" 是一個(gè)字面值常量
  • 整數(shù) 1 是一個(gè)字面值常量

所以,編譯器將兩個(gè)常量在編譯過(guò)程中,計(jì)算然后合并成一個(gè)字符串常量test1,并保存在常量池中。

所以在代碼執(zhí)行過(guò)程中,根本就沒(méi)有創(chuàng)建任何對(duì)象。

本文轉(zhuǎn)載自微信公眾號(hào)「Golang In Memory」


當(dāng)前題目:一個(gè)關(guān)于Java字符串對(duì)象問(wèn)題的詳細(xì)解答
URL分享:http://m.5511xx.com/article/dhpschp.html