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