最近面試了很多公司,一些筆試和面試的問題讓我深有感觸。雖然說自己對Java已經(jīng)很熟悉了,不過當面對一些細節(jié)的時候,自己確實有點無從下手。下面簡單的列舉幾個例子: 1.Java中堆和棧的區(qū)別
其實,這個問題并不是很難。不過也許很多程序員往往忽略了這一點,尤其是在垃圾回收的時候。大家可能習慣了Java的GC機制,其實如果能仔細理解GC,我們完全可以提高執(zhí)行程序的效率。那么堆和棧就是最基本的東西。 堆和棧都是Java用來在內(nèi)存存放數(shù)據(jù)的地方。 簡單的來說,用new創(chuàng)建的對象,即運行時動態(tài)的分配內(nèi)存,存在堆中。堆是由垃圾回收來負責的,堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,Java的垃圾收集器會自動收走這些不再使用的數(shù)據(jù)。 為了提高程序的效率,當我們不需要使用這個對象時,只要簡單停止對它的引用即可,即把這個對象賦值為NULL,而不是等垃圾回收站慢慢的回收。 而Java的一些基本數(shù)據(jù)類型和引用一般存在棧中。棧的存取速度很快而且棧中的數(shù)據(jù)可以共享。 2.Java中sleep和wait的區(qū)別
如果你沒有用過線程或很少用到線程,這個問題還真的不好回答,而且很容易混淆。
首先,二者都是使線程暫時停止執(zhí)行的方法。但是二者卻又很大的不同。
最基礎(chǔ)的一點就是sleep是Thread中的方法,而wait是Object中的方法。
sleep是使當前線程暫時睡眠,可以放在任何位置。而wait是使當前線程暫時放棄對象的使用權(quán)進行等待,必須放在同步方法或同步塊里。sleep使用的時候,線程并不會放棄對象的使用權(quán),即不會釋放對象鎖,所以在同步方法或同步塊中使用sleep,一個線程訪問時,其他的線程也是無法訪問的。而wait是會釋放對象鎖的,就是當前線程放棄對象的使用權(quán),讓其他的線程可以訪問。線程執(zhí)行wait方法時,需要另一個線程調(diào)用 notify進行喚醒。而sleep只是暫時休眠一定時間,時間到了之后,自動恢復(fù)運行,不需另外的線程喚醒。
簡單的來說,sleep只是暫時休眠而已。而wait則通常用與線程同步,經(jīng)常與notify和notifyAll使用。
3.你聽過的Java的設(shè)計模式
如果不是寫過多年的代碼,這個問題可能真的不好回答。也許很多初學者會說Java Web開發(fā)中的MVC算不算?其實,我以前聽過的設(shè)計模式也不是很多。最多的可能就是工廠(Factory)模式,單態(tài)(Singleton)模式等。關(guān)于設(shè)計模式,我向大家推薦《Java Design Patterns》,一定會讓你獲益匪淺。
另外 http://www.jdon.com/designpatterns/
http://www4.it168.com/jtzt/shenlan/tech/javadesignpatern/index.html
http://www.ibm.com/developerworks/cn/java/design/
http://www.cn-java.com/www1/?action-category-catid-101
上述四個網(wǎng)站都是關(guān)于Java設(shè)計模式的版塊,可以學習到很多東西。
posted on 2010-04-16 10:08
landon 閱讀(1893)
評論(0) 編輯 收藏 所屬分類:
Program