首页 > 编程知识 正文

javaintinteger例子,单例模式 枚举

时间:2023-05-04 08:20:02 阅读:167583 作者:1251

在本节中,我们来看看大家都很熟悉的对象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也有缓存,但不能指定缓存的最大值。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。