一个例题,了解包装类

下列代码输出什么,为什么?

public class Test3 {
    public static void main(String[] args) {
        Integer a1 = 100;
        Integer a2 = Integer.valueOf(100);
        Integer a3 = new Integer(100);
        System.out.println(a1 == a2);
        System.out.println(a1 == a3);
        System.out.println(a1.equals(a3));
        System.out.println("--------------------");
        Integer b1 = 200;
        Integer b2 = Integer.valueOf(200);
        Integer b3 = new Integer(200);
        System.out.println(b1 == b2);
        System.out.println(b1 == b3);
        System.out.println(b1.equals(b2));
        System.out.println("--------------------");
        Float c1 = 100f;
        Float c2 = Float.valueOf(100f);
        Float c3 = new Float(100f);
        System.out.println(c1 == c2);
        System.out.println(c1 == c3);
        System.out.println(c1.equals(c3));
    }
}

输出:

理由:
首先  Integer a1 = 100;
Integer a2 = Integer.valueOf(100) ;
Integer a3 = new Integer(100)
第一种写法和第二种写法没有本质区别,第二种写法是手动装箱,用valueOf这个方法,根据这个方法来实现的,第一种方法是自动装箱,我们不写valueOf方法,java会自动帮我们写.
第二种和第三种写法都是手动装箱,但是还是有一些区别的:
valueOf这样写,返回的是什么是根据valueOf内部方法来决定的,而new 是直接创建了一个新的对象把值存入到对象的某个属性中.
所以a1 ==  a2 为 true,原因是在Inteager.valueOf中,在-128 到 127 之间会直接返回一个现成的对象,这个对象里面存入了对应的值,如果不在这个范围,就重新new一个对象,把值存入到对象的某个属性中,
100在这个范围内,所以 a1 和 a2 指向的是同一个对象,而a3重新new了一个对象,a1和a3指向的是俩个不同的对象,所以返回值为false,而equals方法中判断的是a1和a3想对应的值知否相同,所以这里是true
下面同理,b1,b2,b3不在-128到127这个范围,都是直接创建了一个对象,所以它们指向的对象并不相同,虽然值相同,所以前俩个为false,equals判断的是值是否相同,这里b1和b3的值都是200,返回true

同样的,c1,c2,c3也是同理,只是这里Float的valueOf方法,没有返回判断区间什么的说法,都是直接new对象,把值放入到对象中的

Integer.valueOf的源码:

 Float.valueOf的源码

猜你喜欢

转载自blog.csdn.net/qq_62712350/article/details/128512714