1. 程式人生 > >Java Integer和String記憶體儲存

Java Integer和String記憶體儲存

先看程式碼:

void foo()
{
    Integer i1 = 2;
    Integer i2 = 2;
    Integer i3 = new Integer(2);
    System.out.println("i1 = i2? " + (i1 == i2));  //true
    System.out.println("i1 = i3? " + (i1 == i3));  //false

    Integer i4 = 1000;
    Integer i5 = 1000;
    System.out.println("i4 = i5? " + (i4 == i5)); //false
String s1 = "cat"; String s2 = "cat"; String s3 = new String("cat"); System.out.println("s1 = s2? " + (s1 == s2)); //true System.out.println("s1 = s3? " + (s1 == s3)); //false }

測試的結果:

i1 = i2? true
i1 = i3? false
i4 = i5? false
s1 = s2? true
s1 = s3? false

在Java中,對於物件==

是比較兩個物件的地址。

Integer的儲存

  • Integer是int的封裝類,一般來說基礎變數(int)賦值給Integer物件將自動裝箱(Auto Boxing)併為Integer物件分配堆空間。因此即使基礎變數值一樣,封裝類物件指向不同地址。所以System.out.println("i4 = i5? " + (i4 == i5)); //false
  • 對JVM為了節省空間, 當Integer的值落在-128~127之間時,如Integer i1 = 2; Integer i2 = 2;此時JVM首先檢查是否已存在值為2的Integer物件。如果是,則i2直接是引用已存在物件,即i2 = i1
    。所以System.out.println("i1 = i2? " + (i1 == i2)); //true
    事實上, Integer已經預設建立了數值[-128~127]的Integer快取資料。所以使用Integer i1=2時,JVM會直接在該在物件池找到該值的引用。
  • 對於顯式的new Integer(2),JVM將直接分配新空間。所以System.out.println("i1 = i3? " + (i1 == i3)); //false


String的儲存

  • 對於使用字面量賦值方式。JVM為了節省空間,s2會首先查詢JVM中是否有"cat"的字串常量。如果已經存在,則直接返回該引用,而無需重新建立物件。
  • 物件new建立方式,JVM將分配新空間。
   String s1 = "china";
  String s2 = "china";
  String ss1= new String("china");
  String ss2 = new String("china");
   int i =1;
   int j =1;
   public static final int  i1 = 1;
   public static final int  j1 = 1;
   Integer it1= 127;
   Integer it2= 127;
   Integer it11= 128;
   Integer it12= 128;