2018-07-31-4道Java面試題

4道Java面試題

本人第一次寫博客颅拦,最近看到了幾道Java面試題就來分享一下:


1.==符號的使用

public class Example01 {
    public static void main(String[] args) {
        Integer a = 1000,b=1000;
        Integer c = 100,d=100;  
        System.out.println(a==b);
        System.out.println(c==d);
    }   
}

不知道大家怎么做的丈攒,是不是和我一樣認(rèn)為兩個都為true承耿,公布結(jié)果吧:false,true

我們知道==比較的是兩個對象的引用接箫,這里的abcd都是新建出來的對象,按理說都應(yīng)該輸入false才對片排。這就是這道題的有趣之處寨腔,無論是面試題還是論壇討論區(qū),這道題的出場率都很高率寡。原理其實很簡單迫卢,我們?nèi)タ聪翴nteger.java這個類就了然了。

public static Integer valueOf(int i) {
   return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
 }
  
 /**
  * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
  */
 private static final Integer[] SMALL_VALUES = new Integer[256];
  
 static {
   for (int i = -128; i < 128; i++) {
     SMALL_VALUES[i + 128] = new Integer(i);
   }
 }

當(dāng)我們聲明一個Integer c = 100;的時候冶共。此時會進(jìn)行自動裝箱操作乾蛤,簡單點說每界,也就是把基本數(shù)據(jù)類型轉(zhuǎn)換成Integer對象,而轉(zhuǎn)換成Integer對象正是調(diào)用的valueOf方法家卖,可以看到眨层,Integer中把-128-127 緩存了下來。官方解釋是小的數(shù)字使用的頻率比較高上荡,所以為了優(yōu)化性能趴樱,把這之間的數(shù)緩存了下來。這就是為什么這道題的答案回事false和ture了榛臼。當(dāng)聲明的Integer對象的值在-128-127之間的時候,引用的是同一個對象窜司,所以結(jié)果是true沛善。

2.String

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

大家又來猜一猜這道題的答案是什么?
按照==的語法來看塞祈, 首先s1金刁、s2、s3是三個不同的對象议薪,常理來說尤蛮,輸出都會是false。然而程序的運行結(jié)果確實true斯议、false产捞。第二個輸出false可以理解,第一個輸出true就又讓人費解了哼御。我們知道一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配坯临,而堆內(nèi)存中則存放new 出來的對象和數(shù)組。然而除此之外還有一塊區(qū)域叫做常量池恋昼。像我們通常想String s1 = "abc"; 這樣申明的字符串對象看靠,其值就是存儲在常量池中。當(dāng)我們創(chuàng)建String s1 = "abc"這樣一個對象之后液肌,"abc"就存儲到了常量池(也可叫做字符串池)中挟炬,當(dāng)我們創(chuàng)建引用String s2 = "abc" 的時候,Java底層會優(yōu)先在常量池中查找是否存在"abc"嗦哆,如果存在則讓s2指向這個值谤祖,不會重新創(chuàng)建,如果常量池中沒有則創(chuàng)建并添加的池中老速。這就是為什么答案是true 和false的原因泊脐。

3.final關(guān)鍵字

public void mRun(final String name){
   new Runnable()     
     public void run() {
             try {
              Thread.sleep(1000);
             } catch (InterruptedException e) {
              // TODO Auto-generated catch block
             e.printStackTrace();
             } 
             System.out.println(name);
     }
   }.start();
 }

這種代碼相信大家寫過很多,當(dāng)內(nèi)部類訪問局部變量的時候烁峭,需要在局部變量前加final修飾符容客,不然編譯器就會報錯秕铛。通常我們也是這么干的。好的缩挑,第二個問題來了但两,為什么要加final修飾符?相信大多數(shù)小伙伴都沒有思考過這個問題供置,但凡使用的時候谨湘,直接加上就得了,從來沒去深究過其中的原理芥丧。這對于一個優(yōu)秀的程序員來說是不可取紧阔,我們不僅要知其然還要知其所以然。
現(xiàn)在我們來分析一下续担,為什么要加final關(guān)鍵字擅耽。首先內(nèi)部類的生命周期是成員級別的,而局部變量的生命周期實在方法體之類物遇。也就是說會出現(xiàn)這樣一種情況乖仇,當(dāng)mRun方法執(zhí)行,new 的線程運行询兴,新線程里面會睡一秒乃沙。主線程會繼續(xù)執(zhí)行,mRun執(zhí)行完畢诗舰,name屬性生命周期結(jié)束警儒。1秒之后,Syetem.out.printh(name)執(zhí)行眶根。然而此時name已經(jīng)壽終正寢冷蚂,不在內(nèi)存中了。Java就是為了杜絕這種錯誤汛闸,嚴(yán)格要求內(nèi)部類中方位局部變量蝙茶,必須使用final關(guān)鍵字修飾。局部變量被final修飾之后诸老,此時會在內(nèi)存中保有一份局部變得的復(fù)制品隆夯,當(dāng)內(nèi)部類訪問的時候其實訪問的是這個復(fù)制品。這就好像是把局部變量的生命周期變長了别伏。說到底還是Java工程師提前把這個坑給我們填了蹄衷,不然不知道又會有多少小伙伴會為了內(nèi)部類局部變量而發(fā)愁了

4.Integer與int那些事

Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);
System.out.println(a == b);
System.out.println(c == d);

這道題是繼第一題的后續(xù),如果這道題你能很快速的得出答案厘肮,那么恭喜你愧口,==比較符你就算掌握的比較透徹了。
揭曉正確答案: true 类茂、false
看到這個答案很多小伙伴又會不解耍属,先來說下第二個托嚣,按第一題來說Integer不是把-128-127緩存起來了嗎?這不是應(yīng)該是true嘛厚骗,但是你仔細(xì)看示启,這里的Integer是我們自己new出來的,并不是用的緩存领舰,所以結(jié)果是false夫嗓。 現(xiàn)在來看第一個為啥又是true了呢? 首先這里的值為1000冲秽,肯定和我們所知的Integer緩存沒有關(guān)系舍咖。既然和緩存沒有關(guān)系,a是新new出來的對象锉桑,按理說輸入應(yīng)該是false才對排霉。但是注意b這里是int類型。當(dāng)int和Integer進(jìn)行==比較的時候刨仑,Java會把Integer進(jìn)行自動拆箱郑诺,也就是把Integer轉(zhuǎn)成int類型夹姥,所以這里進(jìn)行比較的是int類型的值杉武,所以結(jié)果即為true。

轉(zhuǎn)自公眾號Java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辙售,一起剝皮案震驚了整個濱河市轻抱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旦部,老刑警劉巖祈搜,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異士八,居然都是意外死亡容燕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門婚度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蘸秘,“玉大人,你說我怎么就攤上這事蝗茁〈茁玻” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵哮翘,是天一觀的道長颈嚼。 經(jīng)常有香客問我,道長饭寺,這世上最難降的妖魔是什么阻课? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任叫挟,我火速辦了婚禮,結(jié)果婚禮上柑肴,老公的妹妹穿的比我還像新娘霞揉。我一直安慰自己,他們只是感情好晰骑,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布适秩。 她就那樣靜靜地躺著,像睡著了一般硕舆。 火紅的嫁衣襯著肌膚如雪秽荞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天抚官,我揣著相機與錄音扬跋,去河邊找鬼。 笑死凌节,一個胖子當(dāng)著我的面吹牛钦听,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倍奢,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼朴上,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卒煞?” 一聲冷哼從身側(cè)響起痪宰,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畔裕,沒想到半個月后衣撬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡扮饶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年具练,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甜无。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡扛点,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毫蚓,到底是詐尸還是另有隱情占键,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布元潘,位于F島的核電站畔乙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翩概。R本人自食惡果不足惜牲距,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一返咱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牍鞠,春花似錦咖摹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胁后,卻和暖如春店读,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攀芯。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工屯断, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侣诺。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓殖演,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年鸳。 傳聞我的和親對象是個殘疾皇子趴久,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348