标签:
根据Integer类得到Integer实例的方式:
Integer instance=new Integer(int value);
Integer instance=Integer.valueOf(int value);
第一种方式每次当然都会产生一个新的实例,但是第二种方式就不尽然:
1 public static void main(String[]args) { 2 Integer i1=Integer.valueOf(127); 3 Integer i2=Integer.valueOf(127); 4 System.out.println(i1==i2); 5 6 Integer i3=Integer.valueOf(128); 7 Integer i4=Integer.valueOf(128); 8 System.out.println(i3==i4); 9 10 Integer i5=Integer.valueOf(-128); 11 Integer i6=Integer.valueOf(-128); 12 System.out.println(i5==i6); 13 14 Integer i7=Integer.valueOf(-129); 15 Integer i8=Integer.valueOf(-129); 16 System.out.println(i7==i8); 17 }
true false true false
之所以会导致这种结果,是因为Integer类内部对value值为-128到127范围[-128,127]的实例缓存了下来。
类似如下代码:
1 public class Test { 2 public static void main(String[]args) { 3 MyInteger i1=MyInteger.valueOf(10); 4 MyInteger i2=MyInteger.valueOf(10); 5 System.out.println(i1==i2); 6 7 MyInteger i3=MyInteger.valueOf(11); 8 MyInteger i4=MyInteger.valueOf(11); 9 System.out.println(i3==i4); 10 } 11 } 12 13 class MyInteger { 14 private final int value; 15 public MyInteger(int value) { 16 this.value=value; 17 } 18 public static MyInteger valueOf(int i) { 19 MyInteger[]caches=MyInteger.MyIntegerCache.caches; 20 if(i>=1&&i<=10) { 21 return caches[i-1]; 22 } 23 return new MyInteger(i); 24 } 25 26 static class MyIntegerCache { 27 static MyInteger[]caches=new MyInteger[10]; 28 static { 29 for(int i=0;i<10;i++) { 30 caches[i]=new MyInteger(i+1); 31 } 32 } 33 } 34 }
标签:
原文地址:http://www.cnblogs.com/feijishuo/p/4560727.html