问题一:还记得包装类的缓存吗?再来看看包装类的对比。看下面的代码,最后会打印什么?publicstaticvoidmain(String[]args){Booleanbool1=true,bool2=true;System.out.println("bool1==bool2?"+(bool1==bool2));Characterc1=127,c2=127;Characterc3=128,c4=128;System.out.println("c1==c2?"+(c1==c2));System.out.println("c3==c4?"+(c3==c4));Integeri1=10,i2=10;整数3=300,i4=300;System.out.println("i1==i2?"+(i1==i2));System.out.println("i3==i4?"+(i3==i4));longlong1=10L,long2=10L;Longlong3=300L,long4=300L;System.out.println("long1==long2?"+(long1==long2));System.out.println("long3==long4?"+(long3==long4));Floatfloat1=10f,float2=10f;Floatfloat3=300f,float4=300f;System.out.println("float1==float2?"+(float1==float2));System.out.println("float3==float4?"+(float3==float4));}代码很简单,就是比较每个包装类的几个值,你可以猜到这段代码的打印结果。这里直接贴出打印结果:publicstaticvoidmain(String[]args){Booleanbool1=true,bool2=true;System.out.println("bool1==bool2?"+(bool1==bool2));Characterc1=127,c2=127;Characterc3=128,c4=128;System.out.println("c1==c2?"+(c1==c2));System.out.println("c3==c4?"+(c3==c4));Integeri1=10,i2=10;Integeri3=300,i4=300;System.out.println("i1==i2?"+(i1==i2));System.out.println("i3==i4?"+(i3==i4));Longlong1=10L,long2=10L;Longlong3=300L,long4=300L;System.out.println("long1==long2?"+(long1==long2));System.out.println("long3==long4?"+(long3==long4));Floatfloat1=10f,float2=10f;Floatfloat3=300f,float4=300f;System.out.println("float1==float2?"+(float1==float2));System.out.println("float3==float4?"+(float3==float4));}如果和你预期的结果一致,那么说明你有把握好这里,如果结果和你预想的略有出入,那或许你可以继续往下看。困惑一:首先我们学习String的时候都知道String类是不可变的,所以String常量在编译阶段会被放入字符串常量池中,直接从字符串常量池中取出即可下次用的时候。对于包装类,它们的对象也是不可变的。因此,对于一些经常使用的值,系统也提供了一个包装类缓存,在需要的时候直接从缓存中取值,而不是创建一个新的包装类对象。这些包装类缓存的范围如下:boolean的所有值(true和false);char值的0~127;-128~127byte,short,int,long;以Long为例,简单看一下源码:privatestaticclassLongCache{privateLongCache(){}staticfinalLongcache[]=newLong[-(-128)+127+1];static{for(inti=0;i
