面試官:為什麼 Java 不把基本型別放在堆中?我竟然答不上來。。

喝水會長肉發表於2021-12-07

為什麼要把堆和棧區分出來呢?

第一,從軟體設計的角度看,棧代表了處理邏輯,而堆代表了資料。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模組化的思想在軟體設計的方方面面都有體現。

第二,堆與棧的分離,使得堆中的內容可以被多個棧共享(也可以理解為多個執行緒訪問同一個物件)。這種共享的收益是很多的。一方面這種共享提供了一種有效的資料互動方式(如:共享記憶體),另一方面,堆中的共享常量和快取可以被所有棧訪問,節省了空間。

第三,棧因為執行時的需要,比如儲存系統執行的上下文,需要進行地址段的劃分。由於棧只能向上增長,因此就會限制住棧儲存內容的能力。而堆不同,堆中的物件是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。

第四,物件導向就是堆和棧的完美結合。其實,物件導向方式的程式與以前結構化的程式在執行上沒有任何區別。

但是,物件導向的引入,使得對待問題的思考方式發生了改變,而更接近於自然方式的思考。當我們把物件拆開,你會發現,物件的屬性其實就是資料,存放在堆中;而物件的行為(方法),就是執行邏輯,放在棧中。我們在編寫物件的時候,其實即編寫了資料結構,也編寫的處理資料的邏輯。//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!

不得不承認,物件導向的設計,確實很美。

在 Java 中,Main 函式就是棧的起始點,也是程式的起始點。

程式要執行總是有一個起點的。同 C 語言一樣,java 中的 Main 就是那個起點。無論什麼 java 程式,找到 main 就找到了程式執行的入口。最新面試題整理好了,點選Java面試庫小程式線上刷題。

堆中存什麼?棧中存什麼?

堆中存的是物件。棧中存的是基本資料型別和堆中物件的引用。一個物件的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個物件只對應了一個 4 btye 的引用(堆疊分離的好處)。

為什麼不把基本型別放堆中呢?

因為其佔用的空間一般是 1~8 個位元組——需要空間比較少,而且因為是基本型別,所以不會出現動態增長的情況——長度固定,因此棧中儲存就夠了,如果把他存在堆中是沒有什麼意義的(還會浪費空間,後面說明)。

可以這麼說,基本型別和物件的引用都是存放在棧中,而且都是幾個位元組的一個數,因此在程式執行時,他們的處理方式是統一的。但是基本型別、物件引用和物件本身就有所區別了,因為一個是棧中的資料一個是堆中的資料。最常見的一個問題就是,Java 中引數傳遞時的問題。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2846241/,如需轉載,請註明出處,否則將追究法律責任。

相關文章