11 Java中final,finally蒿褂,finalize的區(qū)別
final 用于聲明屬性,方法和類, 分別表示屬性不可變, 方法不可覆蓋, 類不可繼承.
finally 是異常處理語句結(jié)構(gòu)的一部分卒暂,表示總是執(zhí)行.
finalize 是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法昙楚,可以覆蓋此方法提供垃圾收集時的其他資源回收诈嘿,例如關(guān)閉文件等. JVM不保證此方法總被調(diào)用.
12 什么是深拷貝和淺拷
淺拷貝:使用一個已知實例對新創(chuàng)建實例的成員變量逐個賦值,這個方式被稱為淺拷貝奖亚。
深拷貝:當(dāng)一個類的拷貝構(gòu)造方法,不僅要復(fù)制對象的所有非引用成員變量值谭跨,還要為引用類型的成員變量創(chuàng)建新的實例李滴,并且初始化為形式參數(shù)實例值蛮瞄。這個方式稱為深拷貝
13. Object有哪些公用方法?
方法equals測試的是兩個對象是否相等
方法clone進(jìn)行對象拷貝
方法getClass返回和當(dāng)前對象相關(guān)的Class對象
方法notify,notifyall,wait都是用來對給定對象進(jìn)行線程同步的
14 利用軟引用和弱引用解決OOM問題
用一個HashMap來保存圖片的路徑和相應(yīng)圖片對象關(guān)聯(lián)的軟引用之間的映射關(guān)系挂捅,在內(nèi)存不足時,JVM會自動回收這些緩存圖片對象所占用的空間状土,從而有效地避免了OOM的問題
15 通過軟可及對象重獲方法實現(xiàn)Java對象的高速緩存
比如我們創(chuàng)建了一Employee的類,如果每次需要查詢一個雇員的信息蒙谓。哪怕是幾秒中之前剛剛查詢過的,都要重新構(gòu)建一個實例酣倾,這是需要消耗很多時間的谤专。我們可以通過軟引用和 HashMap 的結(jié)合,先是保存引用方面:以軟引用的方式對一個Employee對象的實例進(jìn)行引用并保存該引用到HashMap 上置侍,key 為此雇員的 id,value為這個對象的軟引用杠输,另一方面是取出引用算色,緩存中是否有該Employee實例的軟引用,如果有灾梦,從軟引用中取得。如果沒有軟引用能岩,或者從軟引用中得到的實例是null萧福,重新構(gòu)建一個實例,并保存對這個新建實例的軟引用
15 四種引用的區(qū)別
強引用:如果一個對象具有強引用鲫忍,它就不會被垃圾回收器回收。即使當(dāng)前內(nèi)存空間不足坝辫,JVM 也不會回收它射亏,而是拋出 OutOfMemoryError 錯誤竭业,使程序異常終止及舍。如果想中斷強引用和某個對象之間的關(guān)聯(lián),可以顯式地將引用賦值為null锯玛,這樣一來的話,JVM在合適的時間就會回收該對象
軟引用:在使用軟引用時炕桨,如果內(nèi)存的空間足夠肯腕,軟引用就能繼續(xù)被使用,而不會被垃圾回收器回收实撒,只有在內(nèi)存不足時,軟引用才會被垃圾回收器回收捷兰。
弱引用:具有弱引用的對象擁有的生命周期更短暫负敏。因為當(dāng) JVM 進(jìn)行垃圾回收,一旦發(fā)現(xiàn)弱引用對象顶考,無論當(dāng)前內(nèi)存空間是否充足妖泄,都會將弱引用回收驹沿。不過由于垃圾回收器是一個優(yōu)先級較低的線程蹈胡,所以并不一定能迅速發(fā)現(xiàn)弱引用對象
虛引用:顧名思義,就是形同虛設(shè)罚渐,如果一個對象僅持有虛引用,那么它相當(dāng)于沒有引用病涨,在任何時候都可能被垃圾回收器回收璧坟。
16 堆和棧
基本數(shù)據(jù)類型比變量和對象的引用都是在棧分配的
堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組
類變量(static修飾的變量),程序在一加載的時候就在堆中為類變量分配內(nèi)存雀鹃,堆中的內(nèi)存地址存放在棧中
變量:當(dāng)你使用java關(guān)鍵字new的時候,系統(tǒng)在堆中開辟并不一定是連續(xù)的空間分配給變量囊颅,是根據(jù)零散的堆內(nèi)存地址傅瞻,通過哈希算法換算為一長串?dāng)?shù)字以表征這個變量在堆中的"物理位置”,實例變量的生命周期--當(dāng)實例變量的引用丟失后,將被GC(垃圾回收器)列入可回收“名單”中胳挎,但并不是馬上就釋放堆中內(nèi)存
局部變量: 由聲明在某方法溺森,或某代碼段里(比如for循環(huán)),執(zhí)行到它的時候在棧中開辟內(nèi)存屏积,當(dāng)局部變量一但脫離作用域,內(nèi)存立即釋放