????????我原本是一個醫(yī)學(xué)生国章,但出于很多考慮具钥,我決定轉(zhuǎn)行程序員。相信應(yīng)該也有蠻多人和我一樣液兽,在為自己喜歡的事業(yè)奮斗著骂删。突發(fā)奇想,想記錄下每天一點(diǎn)自己在為Java面試所作的準(zhǔn)備四啰,記錄下自己覺得值得記錄的題目宁玫。這是一個系列,我會一直堅(jiān)持下去柑晒。
1. ?? 接口和抽象類的區(qū)別欧瘪。
2. ?? 方法重寫和重載的區(qū)別:
? ? 1)方法重載:是指在同一個類中匙赞,有同名的方法佛掖,但它們的參數(shù)個數(shù),類型涌庭,順序不同芥被,即參數(shù)列表不同,與返回值坐榆,修飾符無關(guān)拴魄;
? ? 2)方法重寫:是指子類和父類有相同的方法,包括返回值類型,方法名和參數(shù)列表都相同匹中,但子類的方法訪問權(quán)限必須大于或者等于父類夏漱,即三同一不同。子類進(jìn)行方法重寫可以擴(kuò)展父類的方法顶捷,或者添加子類自身特殊的功能挂绰。用@Override進(jìn)行標(biāo)識。重寫只能針對父類實(shí)例方法服赎,對于與父類相同的靜態(tài)方法扮授,稱之為隱藏。
3. ?? string及如Integer等包裝類是不可變對象
? ? 這些對象一旦創(chuàng)建专肪,狀態(tài)變不可改變刹勃,任何的修改都會創(chuàng)建一個新對象。出于性能優(yōu)化的考慮嚎尤,要謹(jǐn)慎使用這些對象荔仁,尤其是需要進(jìn)行修改的時候。但同時芽死,由于這些對象的天生的不可變性乏梁,讓它們在進(jìn)行并發(fā)編程的時候有著天然的優(yōu)勢。如果實(shí)在是需要對這些不可變對象進(jìn)行“真正意義上”的修改关贵,可以利用反射機(jī)制對其修改遇骑。
4. ?? 對于clone的理解
? ? clone,顧名思義揖曾,是復(fù)制的意思落萎,是創(chuàng)建一個對象的方式之一。過程:調(diào)用clone方法時炭剪,先分配一個與源對象大小一致的內(nèi)存空間练链,再使用源對象對應(yīng)的各個域?qū)π聦ο筮M(jìn)行填充,完成后奴拦,方法返回媒鼓,并把這個新對象的引用發(fā)布到外部。
5. ?? 淺拷貝和深拷貝错妖。
? ? object類默認(rèn)的clone方法绿鸣,對于一個包含其他對象引用的對象來說,其實(shí)是一種淺拷貝暂氯。因?yàn)榇藭r對這個對象進(jìn)行clone潮模,只會創(chuàng)建一個新的這個對象,但其內(nèi)部的其他對象的引用還是指向原來的對象株旷。因此再登,要對其深拷貝的話,必須實(shí)現(xiàn)cloneable接口重寫clone方法晾剖。以此類推锉矢,如果一個對象包含多層其他對象的引用,必須把每一層對象都進(jìn)行拷貝齿尽,才能有徹底的深拷貝沽损。這也是比較繁瑣的。
6. ?? string的intern()方法
? ? 該方法首先從常量池中查找是否存在該值循头,如果存在則直接返回绵估,如果不存在則在常量池中創(chuàng)建同一該對象并返回。
7. ?? 強(qiáng)引用卡骂、軟引用国裳、弱引用和虛引用的區(qū)別
? ? 強(qiáng)引用:如果一個對象具有強(qiáng)引用,它就不會被垃圾回收器回收全跨,即使不惜拋出OutOfMemoryError錯誤缝左。如果想中斷對象和強(qiáng)引用的聯(lián)系,可以顯式的講該引用賦值為null浓若,jvm會對其進(jìn)行回收渺杉。
? ? 軟引用:具有軟引用時,如果內(nèi)存空間足夠挪钓,就能繼續(xù)使用而不會被回收是越。只有內(nèi)存不足時才會回收軟引用。
? ? 弱引用:具有弱引用的對象具有更短的生命周期碌上。jvm進(jìn)行垃圾回收倚评,一旦發(fā)現(xiàn)弱引用對象,無論內(nèi)存充足與否都會將其回收馏予。但jvm是一個優(yōu)先級較低的進(jìn)程蔓纠,也不一定能迅速發(fā)現(xiàn)弱引用對象。
? ? 虛引用:相當(dāng)于沒引用吗蚌,在任何時候都有可能被回收腿倚。
8. ?? Java中的“==”和‘equal()’,‘equal()’和hashcode()的區(qū)別
? ? 1) "=="是運(yùn)算符蚯妇,用于比較兩個變量是否相等敷燎,equals()是object的方法,默認(rèn)用于比較對象是否相等箩言,即對象的地址是否相等硬贯。那么說,如果比較的是基本數(shù)據(jù)類型陨收,“==”是比較他們值是否相等饭豹。而對象用“==”比較時鸵赖,是比較他們的內(nèi)容是否相等,而用equals時時比較的內(nèi)存地址拄衰。如果需要比較對象內(nèi)容它褪,則需要重寫該方法。
? ? 2)hashcode()方法是返回一個哈希值翘悉,equals方法是比較兩個對象地址是否相等茫打,如果equals方法返回相等,那么他們的哈希值也一定相等妖混。但是老赤,equals比較不想等,那么他們的hashcode返回值就不好說了制市,可等可不相等抬旺。兩者常用于集合類,向集合添加對象時祥楣,先判斷二者產(chǎn)生的hashcode是否存在嚷狞,若有,則不放入集合荣堰,否則直接放入集合床未。如果hashcode相等,然后通過equals方法判斷要放入的對象和集合的對象是否相等振坚,不相等則放入薇搁,否則不放入。
9. ?? b+=a 和 b = a+b的區(qū)別
? ? +=操作符會在運(yùn)算時進(jìn)行隱式自動類型轉(zhuǎn)換渡八,將加操作的結(jié)果強(qiáng)制轉(zhuǎn)換為持有結(jié)果的類型啃洋。而b=a+b不會自動進(jìn)行轉(zhuǎn)換。
10.????final, finalize和finally的不同之處
? ? 1)final 是一個修飾符屎鳍,可以修飾變量宏娄、方法和類。如果 final 修飾變量逮壁,意味著該變量的值在初始化后不能被改變孵坚。
? ? 2)finalize 方法是在對象被回收之前調(diào)用的方法,給對象自己最后一個復(fù)活的機(jī)會窥淆,但是什么時候調(diào)用 finalize 沒有保證卖宠。
? ? 3)finally 是一個關(guān)鍵字,與 try 和 catch 一起用于異常的處理忧饭。finally 塊一定會被執(zhí)行扛伍,無論在 try 塊中是否有發(fā)生異常。
11. ?? final有哪些用法词裤?
? ? 1)被final修飾的類不可被繼承刺洒;
? ? 2)被final修飾的方法不可被重寫鳖宾;
? ? 3)被final修飾的變量不可被改變。但如果修飾引用逆航,則表示引用不可變鼎文,但引用指向的內(nèi)容可變;
? ? 4)被final修飾的方法纸泡,JVM會嘗試將其內(nèi)聯(lián),提高運(yùn)行效率赖瞒;
? ? 5)被final修飾的常量女揭,在編譯階段會被存入常量池;
? ? 6)一個final域修飾的變量的引用栏饮,在將它賦值給一個引用變量時應(yīng)該要在構(gòu)造函數(shù)對其寫入之后吧兔;
? ? 7)初次讀一個包含final域的對象的引用,與隨后初次讀這個final域,這兩個操作之間不能重排序袍嬉。