1. 程式人生 > >Java中new和不new的區別

Java中new和不new的區別

例如以下兩種情況
1.ArrayList<BookInfo> InfoList=null;
  BookInfo bookinfo=null;
  bookinfo=test.getinfo();

2.ArrayList<BookInfo> InfoList=new ArrayList<BookInfo>();
  BookInfo bookinfo=new BookInfo();
  bookinfo=test.getinfo();

首先要明白,java裡物件傳遞的時候,傳遞的都是引用(也就是物件的地址),這比傳遞整個物件高效的多。而基礎型別,int,double等傳遞的才是值。

比如,(new ArrayList).add(new String(“hello”)),jvm只是把new String(“hello”)的地址存入到了列表list裡面。String str = new String(“Test”),是開闢記憶體放入了物件,並把它的引用賦給str,即str是一個地址,它指向物件new String(“test”)所開闢的記憶體空間,該空間中有值‘test’。

同理,BookInfo bookinfo=null與BookInfo bookinfo=new BookInfo():前者,是聲明瞭一個物件(的引用),jvm並沒有開闢記憶體放入一個物件;而後者,在聲明瞭一個物件的引用後,又把新開闢的沒有儲存任何有效值的物件的地址賦給了他。bookinfo=test.getinfo(),又把它指向了另一個地址 ,也就是說原來開闢的記憶體並沒有用,那就沒有意義。但是java虛擬機器自動垃圾回收機制會判斷並回收記憶體的。。不用想太多。完全可以寫成:ArrayList InfoList=new ArrayList();BookInfo bookinfo=infoList.getInfo()。

綜上:如果你的類在建立後,要自己讀寫資料,那就必須初始化;如果像Bookinfo那樣,完全是為了從其他地方接收引用,也完全可以省了new吧,還有我們需要知道的是,在使用物件的時候一般都是通過New,我們知道通過new關鍵字實際上是在heap(堆中)開闢了一塊記憶體,而等號右邊的這個物件實際上就是一個記憶體地址,不信的話,可以打印出來看看。其實並不僅僅這麼簡單。堆上分配的是大小不定的物件,而棧上物件的大小是固定的,基本資料型別(int,short)什麼的都在棧上,堆上物件的引用也在棧上,如果堆上的物件在棧(stack)上沒有了引用,它就被GC回收了。