<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          工作10年后,再看String s = new String("xyz") 創(chuàng)建了幾個(gè)對(duì)象?

          共 1953字,需瀏覽 4分鐘

           ·

          2021-01-12 20:39


          這個(gè)問(wèn)題相信每個(gè)學(xué)習(xí)java的同學(xué)都不陌生,作為一個(gè)經(jīng)典的面試題,到現(xiàn)在工作這么多年了我真是認(rèn)為挺操蛋的一個(gè)問(wèn)題,在網(wǎng)上到現(xiàn)在你仍然可以看見(jiàn)很多討論這個(gè)問(wèn)題的人,其中不乏工作很多年的人都有爭(zhēng)論,我認(rèn)為還是有必要來(lái)說(shuō)一說(shuō)這個(gè)問(wèn)題的。


          從方法區(qū)說(shuō)起


          常量池存在于方法區(qū),而方法區(qū)在jdk1.7版本前后改變比較大,所以還是先來(lái)說(shuō)說(shuō)方法區(qū)的演變。

          在jdk1.7版本之前,常量池存在于方法區(qū),方法區(qū)是堆的一個(gè)邏輯部分,他有一個(gè)名字叫做非堆

          1.7版本把字符串常量池放到了堆中。

          而在1.8以后,則是移除了永久代,方法區(qū)概念保留,方法區(qū)的實(shí)現(xiàn)改為了元空間,常量池還是在堆中。

          為什么要說(shuō)方法區(qū)的改變,只是為了文章接下來(lái)的內(nèi)容不會(huì)由于JDK的版本而產(chǎn)生分歧,接下來(lái)內(nèi)容都會(huì)以jdk1.8版本作為基礎(chǔ)來(lái)討論。


          String s = new String("xyz");


          先來(lái)一段代碼

          public?class?Test?{
          ????public?static?void?main(String[]?args)?{
          ????????String?s?=?"xyz";
          ????}
          }

          接著我們javac編譯代碼,然后用javap來(lái)反編譯,執(zhí)行javap -c Test

          從結(jié)果來(lái)看,ldc命令在常量池中創(chuàng)建了一個(gè)"xyz"的對(duì)象,然后把他推至操作數(shù)棧頂,然后astore保存到局部變量,return返回。

          接著看第二段面試題中的代碼

          public?class?Test?{
          ????public?static?void?main(String[]?args)?{
          ????????String?s?=?new?String("xyz");
          ????}
          }

          同樣反編譯分析

          很明顯,我們看到new 創(chuàng)建了一個(gè)String對(duì)象,同時(shí)ldc在常量池中創(chuàng)建了"xyz"字符串對(duì)象,之后invokespecial執(zhí)行構(gòu)造函數(shù),astore_1賦值,return返回。

          通過(guò)以上兩個(gè)例子,可以知道String s = new String("xyz"); 創(chuàng)建了2個(gè)對(duì)象,而有些答案說(shuō)的3個(gè)對(duì)象,則是把引用s也算作一個(gè)對(duì)象。

          還有答案說(shuō)xyz存在就創(chuàng)建了2個(gè),不存在就創(chuàng)建了3個(gè)(包含引用s),再來(lái)測(cè)試一下。

          public?class?Test?{
          ????public?static?void?main(String[]?args)?{
          ????????String?s?=?"xyz";
          ????????String?s2?=?new?String("xyz");
          ????}
          }

          從這里,很明顯的發(fā)現(xiàn)這就是我們例子1和2的一個(gè)結(jié)合,但是注意兩次ldc后面的#2,#號(hào)代表著索引,說(shuō)明第二次new String("xyz")的時(shí)候并沒(méi)有重新創(chuàng)建xyz對(duì)象。

          一些常見(jiàn)的指令助記符含義:

          1. nop, 什么都不做。
          2. aconst_null,將 null 推送至棧頂。
          3. iconst_i(變量數(shù)字),將 int 型 i 推送至棧頂。同理有l(wèi)const_0,fconst_0這種你應(yīng)該知道什么意思了
          4. ldc,將 int,float 或 String 型常量值從常量池中推送至棧頂。
          5. iload,將指定的 int 型局部變量推送至棧頂。
          6. istore,將棧頂 int 型數(shù)值存入指定局部變量。同理astore_i代表將棧頂引用型數(shù)值存入第i個(gè)局部變量。
          7. dup,復(fù)制棧頂數(shù)值并將復(fù)制值壓入棧頂。
          8. invokevirtual,調(diào)用實(shí)例方法。
          9. invokespecial,調(diào)用超類(lèi)構(gòu)造方法,實(shí)例初始化方法,私有方法。
          10. invokestatic,調(diào)用靜態(tài)方法。
          11. invokeinterface,調(diào)用接口方法。
          12. invokedynamic,調(diào)用動(dòng)態(tài)鏈接方法。
          13. new,創(chuàng)建一個(gè)對(duì)象,并將其引用值壓入棧頂。


          總結(jié)


          到底創(chuàng)建了幾個(gè)對(duì)象呢?

          1. 如果xyz不存在,引用算對(duì)象的話,那就是3個(gè)

          2. 如果xyz不存在,引用不算對(duì)象的話,那就是2個(gè)

          3. 如果xyz存在,引用算對(duì)象的話,那就是2個(gè)

          4. 如果xyz存在,引用不算對(duì)象的話,那就是1個(gè)

          當(dāng)然,我認(rèn)為引用肯定是不算對(duì)象的,最終答案應(yīng)該是1或者2個(gè),這個(gè)面試題說(shuō)實(shí)話不應(yīng)該出現(xiàn)在初級(jí)面試題里。

          來(lái)源 |?轉(zhuǎn)自:艾小仙

          更多好文章

          1. Java高并發(fā)系列(共34篇)
          2. MySql高手系列(共27篇)
          3. Maven高手系列(共10篇)
          4. Mybatis系列(共12篇)
          5. 聊聊db和緩存一致性常見(jiàn)的實(shí)現(xiàn)方式
          6. 接口冪等性這么重要,它是什么?怎么實(shí)現(xiàn)?
          7. 泛型,有點(diǎn)難度,會(huì)讓很多人懵逼,那是因?yàn)槟銢](méi)有看這篇文章!

          瀏覽 16
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕A片无码免费看 | 国产成人自拍偷拍视频 | 蜜桃导航-精品导航 | aigao| 大香蕉免费网站 |