【對象池】 JAVA

java中的對象池技術,是爲了方便快捷地創建某些對象而出現的,當需要一個對象時,就可以從池中取一個出來(如果池中沒有則創建一個),則在需要重複重複創建相等變量時節省了很多時間。對象池其實也就是一個內存空間,不同於使用new關鍵字創建的對象所在的堆空間。本文只從java使用者的角度來探討java對象池技術,並不涉及對象池的原理及實現方法。

一、對象池中對象和堆中的對象

 public class Test{
        public static void main(String args[]){
          Integer i1=new Integer(1);
          Integer i2=new Integer(1);
          //i1,i2分別位於堆中不同的內存空間
          System.out.println(i1==i2);//輸出false

          Integer i3=1;
          Integer i4=1;
          //i3,i4指向對象池中同一個內存空間
          System.out.println(i3==i4);//輸出true
         
          //很顯然,i1,i3位於不同的內存空間
          System.out.println(i1==i3);//輸出false
        }
    } 
二、8種基本類型的包裝類和對象池

java中基本類型的包裝類的大部分都實現了對象池技術,這些類是Byte,Short,Integer,Long,Character,Boolean,另外兩種浮點數類型的包裝類則沒有實現。另外Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應值小於等於127時纔可使用對象池,也即對象不負責創建和管理大於127的這些類的對象。以下是一些對應的測試代碼:

public class Test{
    public static void main(String[] args){
       //5種整形的包裝類Byte,Short,Integer,Long,Character的對象,
       //在值小於127時可以使用對象池
       Integer i1=127;
       Integer i2=127;
       System.out.println(i1==i2)//輸出true
       //值大於127時,不會從對象池中取對象
       Integer i3=128;
       Integer i4=128;
       System.out.println(i3==i4)//輸出false
       //Boolean類也實現了對象池技術
       Boolean bool1=true;
       Boolean bool2=true;
       System.out.println(bool1==bool2);//輸出true
       //浮點類型的包裝類沒有實現對象池技術
       Double d1=1.0;
       Double d2=1.0;
       System.out.println(d1==d2)//輸出false
      
    }
}

三、String也實現了對象池技術

String類也是java中用得多的類,同樣爲了創建String對象的方便,也實現了對象池的技術,測試代碼如下:

public class Test{
    public static void main(String[] args){
      //s1,s2分別位於堆中不同空間
      String s1=new String("hello");
      String s2=new String("hello");
      System.out.println(s1==s2)//輸出false
      //s3,s4位於池中同一空間
      String s3="hello";
      String s4="hello";
      System.out.println(s3==s4);//輸出true
    }
}



發佈了33 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章