面試官:為什麼 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中基本資料型別和包裝型別有什麼區別?Java資料型別
- 面試官:說說什麼是泛型的型別擦除?面試泛型型別
- 作為技術面試官,我在面試時考慮什麼?面試
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型
- 我說我精通字串,面試官竟然問我Java中的String有沒有長度限制!?字串面試Java
- 什麼鬼,面試官竟然讓我用Redis實現一個訊息佇列!!?面試Redis佇列
- 為什麼我的mysql配不起來MySql
- 面試官:JavaScript 原始資料型別 Symbol 有什麼用?面試JavaScript資料型別Symbol
- 面試官:Java物件引用都有哪些型別?面試Java物件型別
- Java15變數竟然沒什麼區別,八大基本資料型別你知道嗎?Java變數資料型別
- 面試官:兄弟,說說基本型別和包裝型別的區別吧面試型別
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- 什麼仇?什麼怨?我竟然愛上大資料了!大資料
- 面試官:執行緒呼叫2次start會怎樣?我支支吾吾沒答上來面試執行緒
- 面試官問我redis資料型別,我回答了8種面試Redis資料型別
- 面試官:Redis中雜湊資料型別的內部實現方式是什麼?面試Redis資料型別
- 面試官: 你為什麼使用前端框架?面試前端框架
- 為什麼我的servlet在weblogic6.1中跑不起來?ServletWeb
- 面試官:Java的重寫和過載有什麼區別?面試Java
- 美團二面:為什麼不推薦使用 MyBatis 二級快取?大部分人都答不上來!MyBatis快取
- 面試題系列:用了這麼多年的 Java 泛型,我竟然只知道它的皮毛面試題Java泛型
- 面試問你為什麼要用Spring怎麼答?面試Spring
- js中為什麼基本型別資料可以使用屬性和方法JS型別
- 面試官:"Handler的runWithScissors()瞭解嗎?為什麼Google不讓開發者用?"面試Go
- 我說我精通字串,面試官竟然問我Java中的String有沒有長度限制!?|附視訊講解字串面試Java
- 面試官:你還有什麼想問我的?面試
- Java中Switch支援String字串?為什麼不支援long型別?Java字串型別
- 面試官問:ThreadLocal中的鍵為什麼是弱引用?面試thread
- 動畫:面試官問我 0.1 + 0.2 __ 0.3 ? 為什麼?該如何正確回答?動畫面試
- 為什麼我不贊成開發來寫檢視
- 面試官:為什麼 Promise 比setTimeout() 快?面試Promise
- #如何看待問“a = a + b和a += b有什麼區別”的Java面試官?Java面試
- 我為什麼使用 JavaJava
- 面試官:我們來聊一聊Redis吧,你瞭解多少就答多少面試Redis