2021年07年18日 随堂笔记3 包装类

包装类

Integer类中如何存储int

image-20210718153828988

原码里面存储基本类型的变量使用final修饰,所以对包装类进行的数值运算都会返回新的对象。

自动拆箱

1
2
3
4
5
6
Intege m=new Integer(666);
int k=2;
k=m;//自动拆箱
//k=m.intValue()
m=k;//自动装箱
//m=Integer.valueOf(k)

Integer缓存问题 Integer和int的比较

valueOf缓存问题

1
2
3
4
5
6
7
8
public static Integer valueOf(int i) {
// 当输入的i在缓存范围内时
if (i >= IntegerCache.low && i <= IntegerCache.high)
// 直接返回缓存数组中的元素
return IntegerCache.cache[i + (-IntegerCache.low)];
// 当i不再缓存范围内时,创建一个新的对象,返回
return new Integer(i);
}

IntegerCache内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
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;
// 创建能保存low到high之间的元素的数组
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() {}
}

由上面两段源码可以以看出,使用valueOf(int i)方法创建的Interger,如果值在[-128~+127]之间的,返回的是静态缓存里面早就创建好的Integer对象。

验证:

1
2
3
4
5
6
Integer a1 = Integer.valueOf(23);
Integer b1 = Integer.valueOf(23);
System.out.println("是否是同一个对象:" + (a1 == b1));
Integer a2 = Integer.valueOf(239);
Integer b2 = Integer.valueOf(239);
System.out.println("是否是同一个对象:" + (a2 == b2));

运行结果:

1
2
是否是同一个对象:true
是否是同一个对象:false

自动拆箱

当Integer赋值给int或与int比较时,会自动转换成int,然后再进行赋值或比较。

1
2
Integer b4 = Integer.valueOf(239);
System.out.println("是否相等:" + (b3 == b4));

运行结果:

1
是否相等:true

手动拆箱

调用.intValue()方法

1
2
3
int a3 = 23;
Integer a4 = Integer.valueOf(23);
System.out.println("是否相等:" + (a4.intValue() == a3));

运行结果:

1
是否相等:true

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class IntergerValueOfTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a1 = Integer.valueOf(23);
Integer a2 = Integer.valueOf(23);
System.out.println("_____________________________Interger和Interger相互比较_____________________________");
System.out.println("是否是同一个对象:" + (a1 == a2));
Integer b1 = Integer.valueOf(239);
Integer b2 = Integer.valueOf(239);
System.out.println("是否是同一个对象:" + (b1 == b2));
System.out.println("_____________________________int和Interger相互比较_____________________________");
int b3 = 239;
Integer b4 = Integer.valueOf(239);
System.out.println("是否相等:" + (b3 == b4));
int a3 = 23;
Integer a4 = Integer.valueOf(23);
System.out.println("是否相等:" + (a4.intValue() == a3));
}
}

image-20210718154521531