java的Interger自动包装带来的问题

1 首先看一下以下代码:

                Integer b=7;
		Integer c=7;
		Integer r=234;
		Integer d=234;
		System.out.println(b==c);
		System.out.println(b.equals(c));
		System.out.println(r==d);
		System.out.println(r.equals(d));

  

一眼看下去运行结果就是二个==是false,二个equals是true,根据==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。运行结果如下:

true
true
false
true

由于自动包装用Interger类的ValueOf方法实现的,现在去看一下源码ValueOf方法如下:

 

 从上面代码可以看出:当数的范围为-128到127时,二个数==是true,否则是false,Integer里面有一个内部类IntegerCache,是用来做缓存优化性能的。默认缓存了-128到127中间的数字,据说这些使的比较频繁。其实java里面好多的类都有这样的优化。如果在-128-127之间的就直接拿缓存的,不在的就new一个Intege。也就是说自动包装会主动创建一个字节的空间作为缓冲空间来存储-128到127的数。包装类尽量用equals来比较。

原文地址:https://www.cnblogs.com/shareAndStudy/p/12563151.html