• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            JAVA --String類筆試面試題

            字符串對象是一種特殊的對象.String類是一個不可變的類..也就說,String對象一旦創(chuàng)建就不允許修改

            String類有一個對應的String池,也就是 String pool.每一個內容相同的字符串對象都對應于一個pool里的對象.

            1 看下面一段代碼.

            String s = new String("abc");
              String s1 = "abc";
              String s2 = new String("abc");
              
              System.out.println(s == s1);
              System.out.println(s == s2);
              System.out.println(s1 == s2);

            請問 前面三條語句分別創(chuàng)建了幾個對象,分別是什么.后面的輸出分別是什么

            (1)String s = new String("abc"); 這句,創(chuàng)建了兩個對象..其內容都是"abc".注意,s不是對象,只是引用.只有new生成的才是對象.

            創(chuàng)建的流程是,首先括號里的"abc"先到String pool里看有沒"abc"這個對象,沒有則在pool里創(chuàng)建這個對象..所以這里就在pool創(chuàng)建了一個"abc"對象.然后 通過new語句又創(chuàng)建了一個"abc"對象..而這個對象是放在內存的堆里. .這里的s指向堆里的對象.

            (2) String s1 = "abc"; 這條語句,s1當然還是引用.沒啥可說的.后面的"abc".其實就是上面括號里的"abc".執(zhí)行的是相同的操作.即 在pool里查找有沒"abc"這個對象.沒有則創(chuàng)建一個...很顯然,第一條語句在pool里已經創(chuàng)建了一個"abc".所以這條語句沒有創(chuàng)建對象,s1指向的是pool中的"abc"

            (3)String s2 = new String("abc"); 這條語句,其實和第一條是一樣的,但是,因為第一條已經在pool中創(chuàng)建了"abc"這個對象,所以,這條語句創(chuàng)建了一個對象.s2指向的是堆里的"abc".注意,雖然內容都是"abc",s與s2表示的是不同的對象

            (4)接下來就很好說了.下面的三個==判斷.(注意,==永遠是判斷內存地址是否相等) s與s1,一個指向堆里的對象,一個指向pool里的.很明顯是不同的對象.s與s2.上面說了,雖然都是指向堆里的對象,內容也是"abc",但是也不是相同的對象.s1與s2.一個指向pool,一個指向堆.也不是相同的對象.所以三個都返回false.

            2 第二個問題

            String s = new String("abc");
              String s1 = "abc";
              String s2 = new String("abc");
              
              System.out.println(s == s1.intern());
              System.out.println(s == s2.intern());
              System.out.println(s1 == s2.intern());

            求最后輸出是什么

            解答.最后的答案是 false false true

            intern()方法.按照jdk的幫助文檔來說,是返回字符串對象的規(guī)范化表示形式。通俗一點說,就是返回對應這個字符串內容的那個pool里的對象.這樣說也許還看不太明白,那可以拿具體例子來說

            s1.intern().他的執(zhí)行流程是,在pool里去查找s1對應的內容(也就是"abc").如果找到,則返回pool里的對象.如果沒有(老實說,我沒想到有哪種情況是沒有的),則在Pool創(chuàng)建這個對象,并返回...

            這樣就很容易理解了.s1.intern返回的是pool里的"abc"對象.與s這個堆里的對象肯定不同,返回false.同理,s與s2.intern()也肯定不同,返回false.第三個,s1與s2.intern().其中s2.intern()返回的是pool中的"abc"對象,而s1也是指向pool中的"abc"對象.所以返回的是true:

            3第三個問題

            String hello = "hello";
              String hel = "hel";
              String lo = "lo";
              
              System.out.println(hello == "hel" + "lo");
              System.out.println(hello == "hel" + lo);

            求輸出的結果

            解答 true false

            首先,上面已經說明了,hello hel lo這三個都是指向pool中的對象..

            現在我們考慮"hel" + "lo" 按照內容來說,兩個相加也就是"hello".這個時候,這個會返回pool中的"hello"對象.所以,hello == "hel" + "lo" 返回的是true .

            而"hel" + lo 雖然內容也是"hello",但是它將在堆里面生成一個"hello"對象,并返回這個對象...所以這里的結果是false

            總結一下就是,如果加號兩邊的是字面值(字面值就是直接在""里寫的值,比如上面的"hel"與"lo"),那么將在pool里查找有沒對應內容的對象(這里的內容就是"hello"),并返回pool里的對象.這和hello是一樣的....

            如果加號兩邊不滿足上面的條件(比如,兩邊的值是引用值或者堆里的字符串對象).那么將不會再pool里查找"hello",而是直接在堆里生成一個新的對象...


            轉自:http://jingbo2759.blog.163.com/blog/static/98375315200971731522144/

            posted on 2010-04-23 22:06 abilitytao 閱讀(527) 評論(0)  編輯 收藏 引用

            久久久久亚洲爆乳少妇无| 色综合久久久久无码专区| 97超级碰碰碰久久久久| 国产成人久久久精品二区三区| 久久精品国产精品亜洲毛片| 久久无码AV中文出轨人妻| 97久久婷婷五月综合色d啪蜜芽| 国内精品久久人妻互换| 久久亚洲天堂| 国产美女久久精品香蕉69| 久久人人超碰精品CAOPOREN| AV无码久久久久不卡网站下载| 草草久久久无码国产专区| 亚洲中文字幕无码一久久区| 久久国产影院| 久久天堂电影网| 久久人爽人人爽人人片AV| 久久免费视频1| 久久久久亚洲av成人无码电影| 久久久久人妻一区二区三区vr| 久久精品国产亚洲av瑜伽| 久久久久免费精品国产| 亚洲乱码中文字幕久久孕妇黑人 | 免费一级做a爰片久久毛片潮| 久久亚洲私人国产精品vA| 无码任你躁久久久久久久| 国产高潮国产高潮久久久91 | 亚洲欧洲精品成人久久奇米网| 久久久久国产一级毛片高清版| 色婷婷综合久久久久中文| 亚洲精品NV久久久久久久久久 | 伊人久久大香线焦AV综合影院 | 久久人人爽人人爽人人片AV不 | 久久精品国产亚洲一区二区| 久久久一本精品99久久精品88| 日本高清无卡码一区二区久久| 99久久国产主播综合精品 | 无码专区久久综合久中文字幕| 久久综合亚洲鲁鲁五月天| 狠狠色综合网站久久久久久久高清| 久久精品国产乱子伦|