一.最近在回首Java基礎(chǔ),發(fā)現(xiàn)了一個(gè)挺有意思的概念,簡(jiǎn)言以述之共虑。
A.共同點(diǎn):堆和棧都是Java中常用的存儲(chǔ)結(jié)構(gòu),都是內(nèi)存中存放數(shù)據(jù)的地方呀页。
B.不同點(diǎn):
1.堆 stack:是一個(gè)臨時(shí)的妈拌,動(dòng)態(tài)創(chuàng)建的概念,多數(shù)由是new 出來(lái)的(對(duì)象或數(shù)組)蓬蝶。
作用:主要用于存放對(duì)象尘分,存取速度慢,可以運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存丸氛,生存期不需要提前確定培愁。
示例:String s = new String("hello");
數(shù)據(jù)共享:否 。
由于new出來(lái)的時(shí)間和生命周期不能確定缓窜,故此
String s1 = new String("hello");
String s2 = new String("hello");
s1.equals(s2); 為true定续,可以理解為s1和s2的值是一樣的谍咆,都是hello。
s1==s2; 為false私股,可以理解為s1和s2是分別指向不同的地址(創(chuàng)建的時(shí)間和生命周期不一致)摹察。
2.棧 heap:是一個(gè)生命周期固定的,大小確定的概念倡鲸。
作用:主要用來(lái)執(zhí)行程序供嚎,存取速度快,大小和生存期必須確定峭状,缺乏靈活性克滴。
示例:String s = "hello";
數(shù)據(jù)共享:是 。
由于棧中的數(shù)據(jù)大小和生命周期是固定的优床,故此:
String s1 = "hello";
String s2 = "hello";
s1.equals(s2)劝赔; 返回true
s1==s2; 返回true
首先它會(huì)在棧中創(chuàng)建一個(gè)變量為s1的引用,然后查找有沒(méi)有字面值為hello的地址胆敞,沒(méi)找到着帽,就開(kāi)辟一個(gè)存放hello這個(gè)字面值的地址,然后將s1指向hello的地址竿秆。接著處理String s2="hello"启摄;在創(chuàng)建完s2的引用變量后稿壁,由于在棧中已經(jīng)存在hello這個(gè)字面值幽钢,便將s2直接指向hello的地址。這樣傅是,就出現(xiàn)了s1與s2同時(shí)指向hello這個(gè)地址的情況匪燕。
三.隨手分享,喜歡的朋友可以關(guān)注微信公眾號(hào)MiHomes喧笔,后續(xù)會(huì)有更多更好的博客推送給您帽驯。
另:歡迎指出不足,會(huì)進(jìn)行更正