Java包装类的缓存机制原理实例详解
这篇文章主要介绍了Java包装类的缓存机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java包装类的缓存机制,是在Java5中引入的一个有助于节省内存、提高性能的功能,只有在自动装箱时有效
Integer包装类
举个栗子:
Integera=127; Integerb=127; System.out.println(a==b);
这段代码输出的结果为true
使用自动装箱将基本类型转为封装类对象这个过程其实底层实现是调用封装类的valueOf方法:
Integera=127;相当于Integera=Integer.valueOf(127);
看一下Integer的valueOf方法:
publicstaticIntegervalueOf(inti){ if(i>=IntegerCache.low&&i<=IntegerCache.high) returnIntegerCache.cache[i+(-IntegerCache.low)]; returnnewInteger(i); }
如果入参i大于等于IntegerCache.low或者小于等于IntegerCache.high),就从IntegerCache中获取对象
看一下IntegerCache:
privatestaticclassIntegerCache{ staticfinalintlow=-128; staticfinalinthigh; staticfinalIntegercache[]; static{ //highvaluemaybeconfiguredbyproperty inth=127; StringintegerCacheHighPropValue= sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if(integerCacheHighPropValue!=null){ try{ inti=parseInt(integerCacheHighPropValue); i=Math.max(i,127); //MaximumarraysizeisInteger.MAX_VALUE h=Math.min(i,Integer.MAX_VALUE-(-low)-1); }catch(NumberFormatExceptionnfe){ //Ifthepropertycannotbeparsedintoanint,ignoreit. } } high=h; cache=newInteger[(high-low)+1]; intj=low; for(intk=0;k=127; } privateIntegerCache(){} }
默认范围为:-128到127之间,范围的最大值可以通过java.lang.Integer.IntegerCache.high设置,通过for循环将范围内的数据实例化为Integer对象放到cache数组里
在测试一下:
Integera=128; Integerb=128; System.out.println(a==b);
输出结果为false,所以如果没有指定cache最大值时,在-128到127之间使用自动装箱时,会使用缓存
Byte包装类
再举个栗子:
publicstaticvoidmain(String[]args){ Bytea=127; Byteb=127; System.out.println(a==b);//true }
由于Byte范围在-128到127之间,所以Byte的valueOf都是从ByteCache缓存中获取的
publicstaticBytevalueOf(byteb){ finalintoffset=128; returnByteCache.cache[(int)b+offset]; }
ByteCache类:
privatestaticclassByteCache{ privateByteCache(){} staticfinalBytecache[]=newByte[-(-128)+127+1]; static{ for(inti=0;i与IntegerCache相比,ByteCache的最大值是不能修改的就是127
Short包装类
publicstaticShortvalueOf(shorts){ finalintoffset=128; intsAsInt=s; if(sAsInt>=-128&&sAsInt<=127){//mustcache returnShortCache.cache[sAsInt+offset]; } returnnewShort(s); }ShortCache类:
privatestaticclassShortCache{ privateShortCache(){} staticfinalShortcache[]=newShort[-(-128)+127+1]; static{ for(inti=0;iShortCache的最大值也不可以修改,范围只能在-128~127之间
Long包装类的valueOf方法和LongCache类与Short包装类的实现一致,范围也是只能在-128~127之间
Character包装类
valueOf方法:
publicstaticCharactervalueOf(charc){ if(c<=127){//mustcache returnCharacterCache.cache[(int)c]; } returnnewCharacter(c); }CharacterCache类:
privatestaticclassCharacterCache{ privateCharacterCache(){} staticfinalCharactercache[]=newCharacter[127+1]; static{ for(inti=0;iCharacter的缓存范围在0~127之间
Boolean包装类
valueOf方法:
publicstaticBooleanvalueOf(booleanb){ return(b?TRUE:FALSE); }TRUE跟FALSE都是staticfinal修饰的静态变量
publicstaticfinalBooleanTRUE=newBoolean(true); publicstaticfinalBooleanFALSE=newBoolean(false);Float包装类&Double包装类
valueOf方法:
publicstaticFloatvalueOf(floatf){ returnnewFloat(f); } publicstaticDoublevalueOf(doubled){ returnnewDouble(d); }Float和Double没有使用缓存,直接new的对象
总结:
java的包装类中:Byte,Short,Integer,Long,Character使用static代码块进行初始化缓存,其中Integer的最大值可以通过java.lang.Integer.IntegerCache.high设置;Boolean使用staticfinal实例化的对象;Float和Double直接new的对象没有使用缓存
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。