下列代码输出什么,为什么?
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的源码