Java的幾個問題:堆、棧和sleep、wait

最近面試了很多公司,一些筆試和麪試的問題讓我深有感觸。雖然說自己對Java已經很熟悉了,不過當面對一些細節的時候,自己確實有點無從下手。下面簡單的列舉幾個例子:

        1.Java中堆和棧的區別

        其實,這個問題並不是很難。不過也許很多程序員往往忽略了這一點,尤其是在垃圾回收的時候。大家可能習慣了Java的GC機制,其實如果能仔細理解GC,我們完全可以提高執行程序的效率。那麼堆和棧就是最基本的東西。
        堆和棧都是Java用來在內存存放數據的地方。
        簡單的來說,用new創建的對象,即運行時動態的分配內存,存在堆中。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,Java的垃圾收集器會自動收走這些不再使用的數據。
        爲了提高程序的效率,當我們不需要使用這個對象時,只要簡單停止對它的引用即可,即把這個對象賦值爲NULL,而不是等垃圾回收站慢慢的回收。

而Java的一些基本數據類型和引用一般存在棧中。棧的存取速度很快而且棧中的數據可以共享。

        
2.Java中sleep和wait的區別
            
        如果你沒有用過線程或很少用到線程,這個問題還真的不好回答,而且很容易混淆。
        首先,二者都是使線程暫時停止執行的方法。但是二者卻又很大的不同。
        最基礎的一點就是sleep是Thread中的方法,而wait是Object中的方法。
        sleep是使當前線程暫時睡眠,可以放在任何位置。而wait是使當前線程暫時放棄對象的使用權進行等待,必須放在同步方法或同步塊裏。sleep使用的時候,線程並不會放棄對象的使用權,即不會釋放對象鎖,所以在同步方法或同步塊中使用sleep,一個線程訪問時,其他的線程也是無法訪問的。而wait是會釋放對象鎖的,就是當前線程放棄對象的使用權,讓其他的線程可以訪問。線程執行wait方法時,需要另一個線程調用 notify進行喚醒。而sleep只是暫時休眠一定時間,時間到了之後,自動恢復運行,不需另外的線程喚醒。
        簡單的來說,sleep只是暫時休眠而已。而wait則通常用與線程同步,經常與notify和notifyAll使用。

        3.你聽過的Java的設計模式

        如果不是寫過多年的代碼,這個問題可能真的不好回答。也許很多初學者會說Java Web開發中的MVC算不算?其實,我以前聽過的設計模式也不是很多。最多的可能就是工廠(Factory)模式,單態(Singleton)模式等。關於設計模式,我向大家推薦《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

         上述四個網站都是關於Java設計模式的版塊,可以學習到很多東西。  

發佈了0 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章