在本节中,我们来看看大家都很熟悉的对象Integer也使用享受方模式,并在其中隐藏玄机观看代码的例子。
publicstaticvoidmain (string [ ] args ) {
integera=integer.valueof(105;
Integer b=105;
integerc=integer.valueof(1000;
Integer d=1000;
system.out.println(a==b: ) ) a==b );
system.out.println(c==d: ) ) c==d );
}
你认为那个结果是什么? 运行程序后,我们发现有些错误,得到了意想不到的运行结果。 请参照下图。
a==b :真
c==d :假
之所以得到这样的结果,是因为Integer使用享受源模型来看Integer的源代码。
publicfinalclassintegerextendsnumberimplementscomparable {
.
publicstaticintegervalueof{
assert IntegerCache.high=127;
if (I=integer cache.lowi=integer cache.high ) )。
returnintegercache.cache [ I (-integer cache.low );
returnnewinteger(I;
}
.
}
综上所述,Integer源代码的valueOf ) )方法进行了条件判断。 使用valueof方法创建Integer对象时,如果目标值在- 128到127之间,则直接从缓存中获取该值并返回对IntegerCache.cache中已存在的对象的引用。 否则,创建新的Integer对象。
那么JDK为什么要这么做呢? 因为- 128到127之间的数据在int范围内最常用,所以为了减少频繁创建对象所消耗的内存,这里使用元模式来提高性能。
在以上示例中,a和b的值为100,因此将直接从cache中提取现有对象。 因此,a和b指向同一个对象,而c和d分别指向不同的对象。
类似地,Integer、Short、Byte、Character和Long等类的valueOf方法的实现类似,而Double和Float的valueOf方法的实现类似。 因为浮点数所在范围内的个数是有限的。
展开
与Integer一样,Long源代码也使用通道模式并缓存- 128到127之间的值。 源代码应该如下所示。
publicfinalclasslongextendsnumberimplementscomparable {
publicstaticlongvalueof{
final int offset=128;
if(L=-128L=127 ) ({ //will cache
returnlongcache.cache[(int ) l offset];
}
returnnewLong(L;
}
私有状态类长缓存{
私有长缓存
saticfinallongcache [ ]=newlong [-(-128 ) 127 );
静态{
for(intI=0; i cache.length; I )
cache[I]=newLong(I-128;
}
}
.
}
同样,Long也有缓存,但不能指定缓存的最大值。