java中堆和栈有什么区别?
堆和棧都是Java用來(lái)在RAM中存放數(shù)據(jù)的地方。
一、堆
(1)Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類(lèi)的對(duì)象從堆中分配空間。這些對(duì)象通過(guò)new等指令建立,通過(guò)垃圾回收器來(lái)銷(xiāo)毀。
(2)堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存空間,需要多少內(nèi)存空間不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配的。但缺點(diǎn)是,由于需要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,所以存取速度較慢。
二、棧
(1)棧中主要存放一些基本數(shù)據(jù)類(lèi)型的變量(byte,short,int,long,float,double,boolean,char)和對(duì)象的引用。
(2)棧的優(yōu)勢(shì)是,存取速度比堆快,棧數(shù)據(jù)可以共享。但缺點(diǎn)是,存放在棧中的數(shù)據(jù)占用多少內(nèi)存空間需要在編譯時(shí)確定下來(lái),缺乏靈活性。
三、舉例說(shuō)明棧數(shù)據(jù)可以共享
String 可以用以下兩種方式來(lái)創(chuàng)建:
第一種使用new來(lái)創(chuàng)建的對(duì)象,它存放在堆中。每調(diào)用一次就創(chuàng)建一個(gè)新的對(duì)象。
第二種是先在棧中創(chuàng)建對(duì)象的引用str2,然后查找棧中有沒(méi)有存放“abc”,如果沒(méi)有,則將“abc”存放進(jìn)棧,并將str2指向“abc”,如果已經(jīng)有“abc”, 則直接將str2指向“abc”。
下面用代碼說(shuō)明上面的理論:
輸出結(jié)果為:false
輸出結(jié)果為:true
因此,用第二種方式創(chuàng)建多個(gè)“abc”字符串,在內(nèi)存中其實(shí)只存在一個(gè)對(duì)象而已,?這種寫(xiě)法有利于節(jié)省內(nèi)存空間。
同時(shí)還可以提高程序的運(yùn)行速度,因?yàn)镴VM會(huì)自動(dòng)根據(jù)棧中數(shù)據(jù)的實(shí)際情況來(lái)決定是否創(chuàng)建新對(duì)象。
?為了讓學(xué)習(xí)變得輕松、高效,今天給大家免費(fèi)分享一套Java教學(xué)資源。幫助大家在成為Java架構(gòu)師的道路上披荊斬棘。需要資料的歡迎加入學(xué)習(xí)交流群:9285,05736
總結(jié)
以上是生活随笔為你收集整理的java中堆和栈有什么区别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cesium js 路径_vue2.0项
- 下一篇: JAVA四种遍历Map的方法