棧(stack)與堆(heap)區別以及Java的string變數賦值的內部工作機制(精典轉載貼)
1. 棧(stack)與堆(heap)都是Java用來在Ram中存放資料的地方。
2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。另外,棧資料可以共用,詳見第3點。堆的優勢是可以動態地分配記憶體大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在運行時動態分配記憶體,存取速度較慢。
3. Java中的資料類型有兩種。基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char。存在於棧中。另一種是封裝類資料,如Integer, String, Double等將相應的基礎資料型別 (Elementary Data Type)封裝起來的類。這些類資料全部存在於堆中.
String str = "abc";和String str = new String("abc");和char[] c = {'a','b','c'};String str=new String(c);都採用堆儲存
String str = "abc";在棧中如果沒有存放值為"abc"的地址,等同於:
String temp=new String("abc");
String str=temp;
關於String str = "abc"的內部工作。Java內部將此語句轉化為以下幾個步驟:
(1)先定義一個名為str的對String類的對象引用變數:String str;
(2)在棧中尋找有沒有存放值為"abc"的地址,如果沒有,則開闢一個存放字面值為"abc"的地址,接著建立一個新的String類的對象o,並將o的字串值指向這個地址,而且在棧中這個地址旁邊記下這個引用的對象o。如果已經有了值為"abc"的地址,則尋找對象o,並返回o的地址。
(3)將str指向對象o的地址。
使用String str = "abc";的方式,可以在一定程度上提高程式的運行速度,因為JVM會自動根據棧中資料的實際情況來決定是否有必要建立新對象。而對於String str = new String("abc");的代碼,則一概在堆中建立新對象,而不管其字串值是否相等,是否有必要建立新對象,從而加重了程式的負擔。
char[] c = {'a','b','c'};String str=new String(c);等同於:
String str = new String('a'+'b'+'c');
***********************************************************************************
*轉貼:http://community.csdn.net/Expert/topic/4848/4848360.xml?*temp=9.325808E-02
*看完之後真正的明白了,感謝! 和大家一起分享!!
***********************************************************************************