更新時(shí)間:2020-08-10 16:05:07 來源:動(dòng)力節(jié)點(diǎn) 瀏覽3253次
一、==符的使用
首先看一段比較有意思的代碼

如果這道題你能得出正確答案,并能了解其中的原理的話。說明你基礎(chǔ)還可以。
如果你的答案是true和true的話,你的基礎(chǔ)可能有所欠缺。
首先公布下答案,運(yùn)行代碼,我們會得到false true。
我們知道==比較的是兩個(gè)對象的引用,這里的abcd都是新建出來的對象,按理說都應(yīng)該輸入false才對。這就是這道題的有趣之處,無論是面試題還是論壇討論區(qū),這道題的出場率都很高。原理其實(shí)很簡單,我們?nèi)タ聪翴nteger.java這個(gè)類就了然了。

當(dāng)我們聲明一個(gè)Integer c=100;的時(shí)候。此時(shí)會進(jìn)行自動(dòng)裝箱操作,簡單點(diǎ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之間的時(shí)候,引用的是同一個(gè)對象,所以結(jié)果是true。
二、String
接著看代碼

那么這道題的答案是什么
按照==的語法來看,首先s1、s2、s3是三個(gè)不同的對象,常理來說,輸出都會是false。然而程序的運(yùn)行結(jié)果確實(shí)true、false。第二個(gè)輸出false可以理解,第一個(gè)輸出true就又讓人費(fèi)解了。
我們知道一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配,而堆內(nèi)存中則存放new出來的對象和數(shù)組。然而除此之外還有一塊區(qū)域叫做常量池。像我們通常想String s1="abc";這樣申明的字符串對象,其值就是存儲在常量池中。當(dāng)我們創(chuàng)建String s1="abc"這樣一個(gè)對象之后,"abc"就存儲到了常量池(也可叫做字符串池)中,當(dāng)我們創(chuàng)建引用String s2="abc"的時(shí)候,Java底層會優(yōu)先在常量池中查找是否存在"abc",如果存在則讓s2指向這個(gè)值,不會重新創(chuàng)建,如果常量池中沒有則創(chuàng)建并添加的池中。這就是為什么答案是true和false的原因。
三、final關(guān)鍵字
還是來看一段代碼

這種代碼相信大家寫過很多,當(dāng)內(nèi)部類訪問局部變量的時(shí)候,需要在局部變量前加final修飾符,不然編譯器就會報(bào)錯(cuò)。通常我們也是這么干的。好的,第二個(gè)問題來了,為什么要加final修飾符?相信大多數(shù)小伙伴都沒有思考過這個(gè)問題,但凡使用的時(shí)候,直接加上就得了,從來沒去深究過其中的原理。這對于一個(gè)優(yōu)秀的程序員來說是不可取,我們不僅要知其然還要知其所以然。
現(xiàn)在我們來分析一下,為什么要加final關(guān)鍵字。首先內(nèi)部類的生命周期是成員級別的,而局部變量的生命周期實(shí)在方法體之內(nèi)。也就是說會出現(xiàn)這樣一種情況,當(dāng)mRun方法執(zhí)行,new的線程運(yùn)行,新線程里面會睡一秒。主線程會繼續(xù)執(zhí)行,mRun執(zhí)行完畢,name屬性生命周期結(jié)束。1秒之后,Syetem.out.printh(name)執(zhí)行。然而此時(shí)name已經(jīng)壽終正寢,不在內(nèi)存中了。Java就是為了杜絕這種錯(cuò)誤,嚴(yán)格要求內(nèi)部類中訪問局部變量,必須使用final關(guān)鍵字修飾。局部變量被final修飾之后,此時(shí)會在內(nèi)存中保有一份局部變量的復(fù)制品,當(dāng)內(nèi)部類訪問的時(shí)候其實(shí)訪問的是這個(gè)復(fù)制品。其實(shí)就是匿名內(nèi)部類會將final的變量當(dāng)成自己的一個(gè)成員變量保存。這就好像是把局部變量的生命周期變長了。說到底還是Java工程師提前把這個(gè)坑給我們填了,不然不知道又會有多少小伙伴會為了內(nèi)部類局部變量而發(fā)愁了。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“初學(xué)者Java學(xué)習(xí)練習(xí)題”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀

初級 202925

初級 203221

初級 202629

初級 203743