Java自动装箱和自动拆箱相关的案例

Java自动装箱和自动拆箱相关的案例

自动装箱

Java的自动装箱是指基本数据类型可以自动向包装类转换
比如
Character ch = 'a';

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(i);

上面这段代码在编译以后等同于

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(Integer.valueOf(i));

自动拆箱

Java的自动拆箱是指当遇到运算符 %,+,-,*,/,的时候,包装类不能直接比较,而是把包装类转为基本数据类型再比较。
这段代码

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i: li)
        if (i % 2 == 0)
            sum += i;
        return sum;
}

就使用自动拆箱,等同于

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i : li)
        if (i.intValue() % 2 == 0)
            sum += i.intValue();
        return sum;
}

例子

1、
System.out.println(Integer.valueOf(127)==Integer.valueOf(127));结果是true
因为Integer.valueOf()返回的是对象,由于Integer的缓存,在[-128,127]范围的Integer返回的是同一个对象,所以同一个对象比较地址,结果就相同。
2、
System.out.println(Integer.valueOf(128)==Integer.valueOf(128));结果是false
两个128的Integer都是new出来的两个不同的对象,比较结果不相同。
3、
System.out.println(Integer.valueOf(128)==128);结果是true
使用了自动拆箱,把包装类转为基本数据类型。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注