兩個。第一個物件是字串常量"xyz" 第二個物件是new String("xyz")的時候產生的1、記憶體存放的地址不同:當在一段程式碼塊定義一個變數時,Java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作他用。堆記憶體用來存放由new建立的物件和陣列。 在堆中分配的記憶體,由Java虛擬機器的自動垃圾回收器來管理。2、垃圾處理機制不同:Java 的堆是一個執行時資料區,類的(物件從中分配空間。 這些物件透過new、newarray、 anewarray 和multianewarray 等指令建立,它們不需要程式程式碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配記憶體大小。生存期也不必事先告訴編譯器,因為它是在執行時動態分配記憶體的,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在執行時動態分配記憶體,存取速度較慢。棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放些基本型別的變數 (,int, short, long, byte, float,double, boolean, cha; 和物件控制代碼。棧有一個很重要的特殊性,就是存在棧中的資料可以共享。3、一個是引用,一個是真實存放與記憶體中。java裡物件傳遞的時候,傳遞的都是引用(也就是物件的地址),這比傳遞整個物件高效的多。而基礎型別,int,double等傳遞的才是值。比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list裡面。String str = new String("Test"),是開闢記憶體放入了物件,並把它的引用賦給str。同理,BookInfo bookinfo=null與BookInfo bookinfo=new BookInfo():前者,是聲明瞭一個物件(的引用),jvm並沒有開闢記憶體放入一個物件;而後者,在聲明瞭一個物件的引用後,又把新開闢的沒有儲存任何有效值的物件的地址賦給了他。bookinfo=test.getinfo(),又把它指向了另一個地址。
兩個。第一個物件是字串常量"xyz" 第二個物件是new String("xyz")的時候產生的1、記憶體存放的地址不同:當在一段程式碼塊定義一個變數時,Java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作他用。堆記憶體用來存放由new建立的物件和陣列。 在堆中分配的記憶體,由Java虛擬機器的自動垃圾回收器來管理。2、垃圾處理機制不同:Java 的堆是一個執行時資料區,類的(物件從中分配空間。 這些物件透過new、newarray、 anewarray 和multianewarray 等指令建立,它們不需要程式程式碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配記憶體大小。生存期也不必事先告訴編譯器,因為它是在執行時動態分配記憶體的,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在執行時動態分配記憶體,存取速度較慢。棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放些基本型別的變數 (,int, short, long, byte, float,double, boolean, cha; 和物件控制代碼。棧有一個很重要的特殊性,就是存在棧中的資料可以共享。3、一個是引用,一個是真實存放與記憶體中。java裡物件傳遞的時候,傳遞的都是引用(也就是物件的地址),這比傳遞整個物件高效的多。而基礎型別,int,double等傳遞的才是值。比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list裡面。String str = new String("Test"),是開闢記憶體放入了物件,並把它的引用賦給str。同理,BookInfo bookinfo=null與BookInfo bookinfo=new BookInfo():前者,是聲明瞭一個物件(的引用),jvm並沒有開闢記憶體放入一個物件;而後者,在聲明瞭一個物件的引用後,又把新開闢的沒有儲存任何有效值的物件的地址賦給了他。bookinfo=test.getinfo(),又把它指向了另一個地址。