JAVA堆裡放啥,棧裡放啥,一看就懂

2021-08-27 06:00:11 字數 2222 閱讀 4313

關於堆疊的內容網上已經有很多資料了,這是我找的加上自己理解的一篇說明文:

一、記憶體區域型別

1.暫存器:最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制;

1. 棧:存放基本型別的變數資料和物件的引用,但物件本身不存放在棧中,而是存放在堆(new 出來的物件)或者常量池中(物件可能在常量池裡)(字串常量物件存放在常量池中。);

2. 堆:存放所有new出來的物件;

3. 靜態域:存放靜態成員(static定義的);

4. 常量池:存放字串常量和基本型別常量(public static final)。有時,在嵌入式系統中,常量本身會和其他部分分割離開(由於版權等其他原因),所以在這種情況下,可以選擇將其放在rom中 ;

5. 非ram儲存:硬碟等永久儲存空間

二、棧中放的東西,圖示:

三、堆存放示意圖:

對於string類的物件特別說明一下:

四、按值傳入還是引用傳入

理解了堆疊資料儲存,再來理解一下值傳遞和引用傳遞的概念;

1、基本型別:

經過了痛苦的手術後,發現自己還是個男的,這是為啥?換個寫法你就懂了:

懂了吧,傳給change()方法的引數值由boy傳遞,傳完就由girl這個變數來處理了,手術期間的那個值是girl這個變數的值,手術前後的那個值是boy的。這個過程可以用乙個故事總結一下:乙個男人不想做男人了,準備做手術換個性別,於是打**給快遞小哥(變數boy)把他送到醫院手術台上,快遞小哥見到醫生後,把那個男的交給了會變性的醫生(方法change()),快遞小哥就走了(快遞小哥還是快遞小哥),醫生開始工作,把他的性別變成女的(girl="女"),那個男的確實手術成功了,只是我們列印的變性後的屬性是快遞小哥的。故事結束,完美!

2、引用傳值

引用要這樣來理解:它是一根繩子,它系著乙個球(物件),但它不是球(物件),我們想找到球(物件),就得先找對應的繩子。

看栗子:

輸出的結果是什麼?

為啥是這個結果,還是來說個故事,你同學給你介紹物件,說這姑娘白白嫩嫩,漂亮地一塌糊塗,你說好呀好呀,那她多大呀?你同學是馬大哈,記不得年齡,就跟你說20歲(user.setage("20")),然後你說確定嗎?我才19歲,年齡大的一概不考慮,於是你同學就去找她的年齡(public void getgirlage(user user)),得到了年齡並把這個年齡儲存在大腦中(user.setage("18")),然後打**跟你說的時候,把年齡的資訊從大腦裡拿出來(user.getage()),18歲是你可以接受的年齡,於是你們就安排見面了...再一次,完美。

那再加個東西,你們看看:

這裡輸出的值是20,看來物件是談不成了,這過程中到底發生了什麼呢?原來是你的同學找那個姑娘的年齡的時候,發現那個姑娘把你同學拉黑了,你同學好面子,還是得給你介紹,於是又找了乙個新的姑娘(user=new user();),還把年齡設成了18歲,你等啊等,等了半年也沒等到,於是你開始著急了,想知道這個姑娘的年齡到底是多少,於是列印輸出姑娘年齡,可是這個姑娘還是第乙個姑娘(你也根本就不知道還有第二個姑娘),得到的就是20,年齡雖然比你大一點,可是半年時間,你也想清楚了,年齡大一點體貼也挺好。於是。。。好了,依然完美!

就扯這麼多,堆疊中放的東西都是固定的,大家記憶一下就好,很簡單的。

在系統裡放乙隻「猴子」,阿里瘋了嗎?

在雲時代,隨著大規模分布式系統和微服務架構技術的演進,你對你的系統健壯性還有多少信心?n沒人能全盤掌握這種分布式系統的複雜結構,也沒人能獲知系統所有的弱點。還有乙個現實我們必須清楚地認識到 網路狀態是複雜的,使用者行為是不可 的,許多事件也是不可預見的。當你的元件崩潰 降級或者失常,系統遇到惡意或者...

在系統裡放乙隻「猴子」,阿里瘋了嗎?

在雲時代,隨著大規模分布式系統和微服務架構技術的演進,你對你的系統健壯性還有多少信心?沒人能全盤掌握這種分布式系統的複雜結構,也沒人能獲知系統所有的弱點。還有乙個現實我們必須清楚地認識到 網路狀態是複雜的,使用者行為是不可 的,許多事件也是不可預見的。當你的元件崩潰 降級或者失常,系統遇到惡意或者小...

在系統裡放乙隻「猴子」,阿里瘋了嗎?

在雲時代,隨著大規模分布式系統和微服務架構技術的演進,你對你的系統健壯性還有多少信心?沒人能全盤掌握這種分布式系統的複雜結構,也沒人能獲知系統所有的弱點。還有乙個現實我們必須清楚地認識到 網路狀態是複雜的,使用者行為是不可 的,許多事件也是不可預見的。當你的元件崩潰 降級或者失常,系統遇到惡意或者小...