int x = 128;int y = 128;int n = 127;int m= 127;Integer d = Integer.valueOf(x);Integer g = Integer.valueOf(y);Integer z = Integer.valueOf(n);Integer v = Integer.valueOf(m);System.out.println(d == g);System.out.println(z == v);
思考一下他的结果是什么?
为什么 d == g的结果是true
z == v的结果是false?
这里的原因咱们还是需要到valueOf方法的源码里去看
这里可以清晰的看到 当传入的参数i在一定范围时 他是直接从一个名为cache的数组中取出参数在cache数组中对应元素的地址 传回去。如果超出这个范围就直接new一个新的对象将这个新对象的地址传回去。
我们点击进入cache数组的代码中可以发现,cache数组的取值范围在-128~+127之间,这也就解释了为什么两个值为127的Ingeter对象利用==进行比较返回的是true,而两个值为128的返回的是false。
这里需要注意的是如果你使用equals方法进行比较,那么他就是直接对两个对象的值进行比较,会返回true(两个对象的地址是否相同没有影响) 。
还有一点就是如果你是通过new生成的对象你对他们的值使用==进行比较他们返回的一定是false因为new是生成一个新的对象,他们不可能指向同个对象,地址也不会相同,也不会存在128陷阱。