面試官:為什麼 Java 不把基本型別放在堆中?我竟然答不上來。。
為什麼要把堆和棧區分出來呢?
第一,從軟體設計的角度看,棧代表了處理邏輯,而堆代表了資料。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模組化的思想在軟體設計的方方面面都有體現。
第二,堆與棧的分離,使得堆中的內容可以被多個棧共享(也可以理解為多個執行緒訪問同一個物件)。這種共享的收益是很多的。一方面這種共享提供了一種有效的資料互動方式(如:共享記憶體),另一方面,堆中的共享常量和快取可以被所有棧訪問,節省了空間。
第三,棧因為執行時的需要,比如儲存系統執行的上下文,需要進行地址段的劃分。由於棧只能向上增長,因此就會限制住棧儲存內容的能力。而堆不同,堆中的物件是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。
第四,物件導向就是堆和棧的完美結合。其實,物件導向方式的程式與以前結構化的程式在執行上沒有任何區別。
但是,物件導向的引入,使得對待問題的思考方式發生了改變,而更接近於自然方式的思考。當我們把物件拆開,你會發現,物件的屬性其實就是資料,存放在堆中;而物件的行為(方法),就是執行邏輯,放在棧中。我們在編寫物件的時候,其實即編寫了資料結構,也編寫的處理資料的邏輯。//java學習交流:737251827 進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
不得不承認,物件導向的設計,確實很美。
在 Java 中,Main 函式就是棧的起始點,也是程式的起始點。
程式要執行總是有一個起點的。同 C 語言一樣,java 中的 Main 就是那個起點。無論什麼 java 程式,找到 main 就找到了程式執行的入口。最新面試題整理好了,點選Java面試庫小程式線上刷題。
堆中存什麼?棧中存什麼?
堆中存的是物件。棧中存的是基本資料型別和堆中物件的引用。一個物件的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個物件只對應了一個 4 btye 的引用(堆疊分離的好處)。
為什麼不把基本型別放堆中呢?
因為其佔用的空間一般是 1~8 個位元組——需要空間比較少,而且因為是基本型別,所以不會出現動態增長的情況——長度固定,因此棧中儲存就夠了,如果把他存在堆中是沒有什麼意義的(還會浪費空間,後面說明)。
可以這麼說,基本型別和物件的引用都是存放在棧中,而且都是幾個位元組的一個數,因此在程式執行時,他們的處理方式是統一的。但是基本型別、物件引用和物件本身就有所區別了,因為一個是棧中的資料一個是堆中的資料。最常見的一個問題就是,Java 中引數傳遞時的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2846241/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面試官:Java 反射是什麼?我回答不上來!面試Java反射
- 面試官:Java中物件都存放在堆中嗎?你知道逃逸分析?面試Java物件
- 面試官問你基本型別時他想知道什麼面試型別
- 面試官:說說什麼是泛型的型別擦除?面試泛型型別
- 面試官瘋了嗎,問我為什麼浮點數不精確?面試
- 作為技術面試官,我在面試時考慮什麼?面試
- 我說我精通字串,面試官竟然問我Java中的String有沒有長度限制!?字串面試Java
- 面試官:Java物件引用都有哪些型別?面試Java物件型別
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型
- 面試官:兄弟,說說基本型別和包裝型別的區別吧面試型別
- 面試官:JavaScript 原始資料型別 Symbol 有什麼用?面試JavaScript資料型別Symbol
- Java中基本資料型別和包裝型別有什麼區別?Java資料型別
- 什麼鬼,面試官竟然讓我用Redis實現一個訊息佇列!!?面試Redis佇列
- 面試問你為什麼要用Spring怎麼答?面試Spring
- 面試官問我redis資料型別,我回答了8種面試Redis資料型別
- 面試官:執行緒呼叫2次start會怎樣?我支支吾吾沒答上來面試執行緒
- 美團二面:為什麼不推薦使用 MyBatis 二級快取?大部分人都答不上來!MyBatis快取
- 面試官:Java的重寫和過載有什麼區別?面試Java
- Java15變數竟然沒什麼區別,八大基本資料型別你知道嗎?Java變數資料型別
- 測試Java中的long,int基本型別Java型別
- 面試官: 你為什麼使用前端框架?面試前端框架
- 面試官:為什麼 Promise 比setTimeout() 快?面試Promise
- 面試題系列:用了這麼多年的 Java 泛型,我竟然只知道它的皮毛面試題Java泛型
- 面試官:Redis中雜湊資料型別的內部實現方式是什麼?面試Redis資料型別
- Spring Boot 面試,一個問題你就答不上來了Spring Boot面試
- 面試官問:ThreadLocal中的鍵為什麼是弱引用?面試thread
- 我說我精通字串,面試官竟然問我Java中的String有沒有長度限制!?|附視訊講解字串面試Java
- #如何看待問“a = a + b和a += b有什麼區別”的Java面試官?Java面試
- 面試官:你還有什麼想問我的?面試
- 面試官:我們來聊一聊Redis吧,你瞭解多少就答多少面試Redis
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- 邦芒面試:這10個問題都答不上來,你還想透過面試?面試
- Java面試題:為什麼HashMap不建議使用物件作為Key?Java面試題HashMap物件
- 面試官問:Java 執行緒沒有 Running 狀態,為什麼?面試Java執行緒
- 面試官:react和vue有什麼區別嗎?面試ReactVue
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- 面試官問我:什麼是JavaScript閉包,我該如何回答面試JavaScript
- 面試官問我按鈕級別許可權怎麼控制,我說v-if,面試官說再見面試