堆和棧都是Java用來在RAM中存放數據的地方。html
堆微信
(1)Java的堆是一個運行時數據區,類的對象從堆中分配空間。這些對象經過new等指令創建,經過垃圾回收器來銷燬。機器學習
(2)堆的優點是能夠動態地分配內存空間,須要多少內存空間沒必要事先告訴編譯器,由於它是在運行時動態分配的。但缺點是,因爲須要在運行時動態分配內存,因此存取速度較慢。學習
棧大數據
(1)棧中主要存放一些基本數據類型的變量(byte,short,int,long,float,double,boolean,char)和對象的引用。人工智能
(2)棧的優點是,存取速度比堆快,棧數據能夠共享。但缺點是,存放在棧中的數據佔用多少內存空間須要在編譯時肯定下來,缺少靈活性。code
舉例說明棧數據能夠共享htm
String 能夠用如下兩種方式來建立:對象
String str1 = new String("abc"); String str2 = "abc";
第一種使用new來建立的對象,它存放在堆中。每調用一次就建立一個新的對象。blog
第二種是先在棧中建立對象的引用str2,而後查找棧中有沒有存放「abc」,若是沒有,則將「abc」存放進棧,並將str2指向「abc」,若是已經有「abc」, 則直接將str2指向「abc」。
下面用代碼說明上面的理論:
public static void main(String[] args) { String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1 == str2); }
輸出結果爲:false
public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); }
輸出結果爲:true
所以,用第二種方式建立多個「abc」字符串,在內存中其實只存在一個對象而已。這種寫法有利於節省內存空間。同時還能夠提升程序的運行速度,由於JVM會自動根據棧中數據的實際狀況來決定是否建立新對象。
來源:www.cnblogs.com/nnngu/p/8300761.html
歡迎關注個人微信公衆號「碼農突圍」,分享Python、Java、大數據、機器學習、人工智能等技術,關注碼農技術提高•職場突圍•思惟躍遷,20萬+碼農成長充電第一站,陪有夢想的你一塊兒成長