面試題匯總

1募寨、下面程序輸出結(jié)果:

public class Demo{
    public static void main(String[] args) throws Exception {
        String s1 = "ab";
        String s2 = "abc";
        String s3 = s1 + "c";
        System.out.println(s3==s2);//true
    }
}

分析:s1 s2都會(huì)在常量池中創(chuàng)建對(duì)象,s3是變量s1和常量"c"拼接而來,通過javap命令 可以看到具體實(shí)現(xiàn)步驟.

//編譯要生成所有調(diào)試信息
javac -g Demo.java
//反編譯
javap -v Demo

使用javap命令結(jié)果如下:

Classfile /C:/Users/Desktop/Demo.class
  Last modified 2018-3-27; size 907 bytes
  MD5 checksum d10a17ec64e71338de935811f6abbb35
  Compiled from "Demo.java"
public class Demo
  SourceFile: "Demo.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool://常量池
   #1 = Methodref          #12.#36        //  java/lang/Object."<init>":()V
   #2 = String             #37            //  ab
   #3 = String             #38            //  abc
   #4 = Class              #39            //  java/lang/StringBuilder
   #5 = Methodref          #4.#36         //  java/lang/StringBuilder."<init>":()V
   #6 = Methodref          #4.#40         //  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #7 = String             #41            //  c
   #8 = Methodref          #4.#42         //  java/lang/StringBuilder.toString:()Ljava/lang/String;
   #9 = Fieldref           #43.#44        //  java/lang/System.out:Ljava/io/PrintStream;
  #10 = Methodref          #45.#46        //  java/io/PrintStream.println:(Z)V
  #11 = Class              #47            //  Demo
  #12 = Class              #48            //  java/lang/Object
  #13 = Utf8               <init>
  #14 = Utf8               ()V
  #15 = Utf8               Code
  #16 = Utf8               LineNumberTable
  #17 = Utf8               LocalVariableTable
  #18 = Utf8               this
  #19 = Utf8               LDemo;
  #20 = Utf8               main
  #21 = Utf8               ([Ljava/lang/String;)V
  #22 = Utf8               args
  #23 = Utf8               [Ljava/lang/String;
  #24 = Utf8               s1
  #25 = Utf8               Ljava/lang/String;
  #26 = Utf8               s2
  #27 = Utf8               s3
  #28 = Utf8               StackMapTable
  #29 = Class              #23            //  "[Ljava/lang/String;"
  #30 = Class              #49            //  java/lang/String
  #31 = Class              #50            //  java/io/PrintStream
  #32 = Utf8               Exceptions
  #33 = Class              #51            //  java/lang/Exception
  #34 = Utf8               SourceFile
  #35 = Utf8               Demo.java
  #36 = NameAndType        #13:#14        //  "<init>":()V
  #37 = Utf8               ab
  #38 = Utf8               abc
  #39 = Utf8               java/lang/StringBuilder
  #40 = NameAndType        #52:#53        //  append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #41 = Utf8               c
  #42 = NameAndType        #54:#55        //  toString:()Ljava/lang/String;
  #43 = Class              #56            //  java/lang/System
  #44 = NameAndType        #57:#58        //  out:Ljava/io/PrintStream;
  #45 = Class              #50            //  java/io/PrintStream
  #46 = NameAndType        #59:#60        //  println:(Z)V
  #47 = Utf8               Demo
  #48 = Utf8               java/lang/Object
  #49 = Utf8               java/lang/String
  #50 = Utf8               java/io/PrintStream
  #51 = Utf8               java/lang/Exception
  #52 = Utf8               append
  #53 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #54 = Utf8               toString
  #55 = Utf8               ()Ljava/lang/String;
  #56 = Utf8               java/lang/System
  #57 = Utf8               out
  #58 = Utf8               Ljava/io/PrintStream;
  #59 = Utf8               println
  #60 = Utf8               (Z)V
{
  public Demo();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   LDemo;

  public static void main(java.lang.String[]) throws java.lang.Exception;
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
         //ldc命令:把常量池中的項(xiàng)壓入棧
         0: ldc           #2                  // String ab
         2: astore_1
         3: ldc           #3                  // String abc
         5: astore_2
         6: new           #4                  // class java/lang/StringBuilder
         9: dup
        10: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
        13: aload_1
        14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        17: ldc           #7                  // String c
        19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        25: astore_3
        26: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
        29: aload_3
        30: aload_2
        31: if_acmpne     38 //如果判斷為true,跳轉(zhuǎn)38行
        34: iconst_1 //也就是false
        35: goto          39
        38: iconst_0
        39: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
        42: return
      LineNumberTable:
        line 3: 0
        line 4: 3
        line 5: 6
        line 6: 26
        line 7: 42
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      43     0  args   [Ljava/lang/String;
               3      40     1    s1   Ljava/lang/String;
               6      37     2    s2   Ljava/lang/String;
              26      17     3    s3   Ljava/lang/String;
      StackMapTable: number_of_entries = 2
           frame_type = 255 /* full_frame */
          offset_delta = 38
          locals = [ class "[Ljava/lang/String;", class java/lang/String, class java/lang/String, class java/lang/String ]
          stack = [ class java/io/PrintStream ]
           frame_type = 255 /* full_frame */
          offset_delta = 0
          locals = [ class "[Ljava/lang/String;", class java/lang/String, class java/lang/String, class java/lang/String ]
          stack = [ class java/io/PrintStream, int ]

    Exceptions:
      throws java.lang.Exception
}

在main方法下面可以看出,String s1 = "ab",底層就是把"ab"字符串從常量池中拿出來賦給s1變量,而s3是通過創(chuàng)建StringBuilder對(duì)象.append()方法進(jìn)行連接,然后調(diào)用toString()再賦值給s3變量,此時(shí)字符串"abc"對(duì)象在堆內(nèi)存中,故判斷s1 == s3為false.

一些概念解釋:
常量池:
在編譯器被確定,并保存在已編譯的.class字節(jié)碼文件中的一些數(shù)據(jù),它包括關(guān)于類,方法,接口中的常量.也包括字符串直接量.
直接量:
指在程序中通過源代碼直接給出的值.如:

String s1 = "hello";
String s2 = "he" + "llo";
s1 == s2 //true

原因:"he"和"llo"都是字符串常量,當(dāng)一個(gè)字符串由多個(gè)字符串常量連接而成時(shí),他本身也就是字符串常量,s2同樣在編譯期就被解析為一個(gè)字符串常量,故為true.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斋竞,一起剝皮案震驚了整個(gè)濱河市忆嗜,隨后出現(xiàn)的幾起案子稍味,更是在濱河造成了極大的恐慌删咱,老刑警劉巖杖小,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荒叶,死亡現(xiàn)場(chǎng)離奇詭異碾阁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)些楣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門脂凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪睹,“玉大人,你說我怎么就攤上這事艰猬『岜ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵冠桃,是天一觀的道長(zhǎng)命贴。 經(jīng)常有香客問我,道長(zhǎng)食听,這世上最難降的妖魔是什么胸蛛? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮樱报,結(jié)果婚禮上葬项,老公的妹妹穿的比我還像新娘。我一直安慰自己迹蛤,他們只是感情好民珍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盗飒,像睡著了一般嚷量。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逆趣,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天蝶溶,我揣著相機(jī)與錄音,去河邊找鬼宣渗。 笑死抖所,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痕囱。 我是一名探鬼主播田轧,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鞍恢!你這毒婦竟也來了涯鲁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤有序,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后岛请,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旭寿,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年崇败,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盅称。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩祥。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缩膝,靈堂內(nèi)的尸體忽然破棺而出混狠,到底是詐尸還是另有隱情,我是刑警寧澤疾层,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布将饺,位于F島的核電站,受9級(jí)特大地震影響痛黎,放射性物質(zhì)發(fā)生泄漏予弧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一湖饱、第九天 我趴在偏房一處隱蔽的房頂上張望掖蛤。 院中可真熱鬧,春花似錦井厌、人聲如沸蚓庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽器赞。三九已至,卻和暖如春蝇恶,著一層夾襖步出監(jiān)牢的瞬間拳魁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工撮弧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潘懊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓贿衍,卻偏偏與公主長(zhǎng)得像授舟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贸辈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容