JavaInterger赋值问题Java Interger赋值问题
package anomyous;
public class Test {
public static void main(String[] args){
Integer i1=new Integer(99);
Integer i2=Integer.valueOf(99);//⼿动装箱
Integer i3=99;//⾃动装箱隐式调⽤Integer.valueOf()
System.out.println(i1==i2);//false
System.out.println(i2==i3);//true 使⽤Integer.valueOf()创建对象,
// 在⼀定范围内会优先查内存中有没有其他同类型对象保存这个值,如果有就会指向该对象地址, // 这⼀点和String⼀样,所以i2和i3地址相同.
System.out.println(i1==i3);//false
System.out.println("end");
}
}
补充:拆箱操作
//拆箱
int i4=i1.intValue();
int i5=i2.intValue();
int i6=i3.intValue();
package anomyous;
public class Test {
public static void main(String[] args){
Integer i1=new Integer(99);
Integer i2=Integer.valueOf(99);
Integer i3=99;
System.out.println(i1==i2);//false
System.out.println(i2==i3);//true
System.out.println(i1==i3);//false
i2=100;//重新创建了对象
System.out.println(i3);//99
System.out.println(i2==i3);//false 当i2的值改变时,i2⼜会指向另⼀个地址,就相当于重新创建对象,
// 此时i2和i3的地址不会相同了,这⼀点也和String类似
System.out.println("end");
}
}
接下来就会发现和String的不同之处
package anomyous;
public class Test {
public static void main(String[] args){
//这次尝试把初始值改⼤点
Integer i1=new Integer(99);
Integer i2=Integer.valueOf(999);
Integer i3=999;
System.out.println(i1==i2);//false
System.out.println(i2==i3);//false 之前说过,在⼀定范围内,Integer.valueOf创建对象才会先查内存中有没有其他同类型对象保存这个值, // 此时超过临界值,不会去查其他已有对象,那么这个临界值是多少呢,将会通过源代码揭晓
System.out.println(i1==i3);//false
System.out.println("end");
}
}
源代码
我们先查看valueOf⽅法的源码
//This method will always cache values in the range -128 to 127,注意上⾯这句话
public static Integer valueOf(int i){
if(i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high)//可以通过查IntegerCache到 low和high
return Integer.IntegerCache.cache[i +(-Integer.IntegerCache.low)];
return new Integer(i);
}
查看IntegerCache源码
private static class IntegerCache {
static final int low =-128;//这⾥是最⼩值
static final int high;
static final Integer cache[];
//静态代码块执⾏优先级⾼于⾮静态的初始化块,随着类的加载⽽执⾏,⽽且只执⾏⼀次static{
// high value may be configured by property
int h =127;//这⾥
String integerCacheHighPropValue =
if(integerCacheHighPropValue != null){
try{
int i =parseInt(integerCacheHighPropValue);
i = Math.max(i,127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE -(-low)-1);
}catch( NumberFormatException nfe){
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;//这⾥是最⼤值
cache =new Integer[(high - low)+1];
int j = low;
for(int k =0; k < cache.length; k++)
cache[k]=new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >=127;
}
private IntegerCache(){}
}
⽬前知道了这个范围是[-128,127]
接下来通过实例验证上述推测
package anomyous;
public class Test {
public static void main(String[] args){
java valueofInteger i2=Integer.valueOf(128);
Integer i3=128;
System.out.println(i2==i3);//128时为false
Integer i4=Integer.valueOf(127);
Integer i5=127;
System.out.println(i4==i5);//127时为true 127为临界值
Integer i6=Integer.valueOf(-129);
Integer i7=-129;
System.out.println(i6==i7);//-129时为false
Integer i8=Integer.valueOf(-128);
Integer i9=-128;
System.out.println(i8==i9);//-128时为true -128为临界值 System.out.println("end");
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论