20180326 java java面向对象-包装类中的缓存设计(享元模式)
eg:
//包装类中的缓存设计
class CacheDemo
{
public static void main()
{
Integer i1 = new Integer(123);
Integer i2 = new Integer(123);
System.out.println(i1 == i2); //输出false
//每new一个对象,就新增加一个地址,对于引用类型比较,
//比较的就是地址
Integer i3 = Integer.valueOf(123);
Integer i4 = Integer.valueOf(123);//123在[-128,127]之间,所取的
//数据就是缓存中的数据,并没有开辟新的内 //存空间, 详情解释见下面的
//"Integer的valueOf内部函数(源代码)"
System.out.println(i3 == i4);//输出true
Integer i5 = 123;
Integer i6 = 123;自动装箱的底层就是通过Integer.valueOf实现的,解释同上
System.out.println(i5 == i6);//输出true
/**************************分割线**********************************/
Integer i7 = new Integer(456);
Integer i8 = new Integer(456);
System.out.println(i7 == i8); //输出false
Integer i9 = Integer.valueOf(456);
Integer i10 = Integer.valueOf(456);//456不在[-128,127]之间,就不能使用
//缓存的数据,所以要new一个新的数据空间
System.out.println(i9 == i10);//输出false
Integer i11 = 456;
Integer i12 = 456;//自动装箱的底层就是通过Integer.valueOf实现的,解释同上
System.out.println(i11 == i12);//输出false
}
}
Integer的valueOf内部函数(源代码):
public static Integer valueOf(int i){
assert IntegerCache.high >=127;
if(i >= IntegerCache.low && i<= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的一个内部类,表示Integer的缓存。缓存的范围是[-128,127],即IntegerCache.low = -128,IntegerCache.high = 127
java语言中的静态代码块,即由static修饰的一段代码块是加载资源,做初始化操作的代码块,eg:
static {
int high = 3;
...
}
包装类的设计(这种设计在java中,又叫享元模式(flyweight )):
1)Byte、Short、Integer、Long均的缓存[-128,127]区间的数据;
2)Character缓存(0,127]区间的数据.
享元模式:Flyweight Pattern,设计原理就是缓存设计,一个元素让大家共用,共用的目的就是节省内存空间,提高性能。
为了防止出现以下情况:
Integer i11 = 456;
Integer i12 = 456;//自动装箱的底层就是通过Integer.valueOf实现的,解释同上
System.out.println(i11 == i12);//输出false
即i11 与 i12 不等的情况,可用 equals()函数 处理(equals()函数内部是通过数值进行的比较),即:
Integer i11 = 456;
Integer i12 = 456;
System.out.println(i11.equals(i12));//输出true
/***************************************************************/
/**** 强烈建议,以后包装类型对象之间的 ***/
/**** 比较,使用equals()函数比较 ***/
/***************************************************************/
equals()函数比较的是包装的数据。