【自动装箱、自动拆箱、new 包装类 的情况下:使用“==“和equals()的源码分析】

	包装类中存在一个 缓存池||常量池 cache其实就是一个数组!里面存储的就是[-128,127]一共256个对象,
	每一个值都对应一个地址,只要自动装箱的对象的值属于这个范围,就会直接到这个 缓存池||常量池 中根据对象的值,
	找到对应的地址给对象用,而不会创建新的对象!

在这里插入图片描述


用等号比较对象时需要看包装类的Valueof()方法【这个方法是用来给包装类创建对象的】的源码,中创建对象的规则,在不同的范围内创建对象的规则不一样
		Integer:
		Integer的自动装箱:
		看Integer.Valueof()的源码可以发现
		public static Integer valueOf(int i) {
			     return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
					}
					
				1.如果自动装箱的两个对象的数据值的范围在[-128,127]的话,并且自动装箱的两个对象的数据值相同的话,不会创建新的对象,而是会从缓冲池中拿那个已经存在的对象,也就是两个对象引用指向同一块地址空间,
				所以用"=="号做比较的话比较的是地址值,那么就会返回true
				
				2.如果自动装箱的值超出范围的话,从下列源码中可以看出,会直接new 一个新的对象返回。那么这个时候两个对象就不是同一个了,地址值自然也不相同了,用"=="号比较返回false
				3.如果使用包装类的equals()方法,底层会先判断是否为该包装类类型,如果不是本包装类型的话直接返回false,如果是相同的包装类型,
				才会比较值,如果值相等就返回true,不相等就返回false.
				
				equals()的源码:
				
				  public boolean equals(Object obj) {
					if (obj instanceof Integer) {
						return this.value == (Integer)obj;
					} else {
						return false;
					}
				}

				4.其他的包装类都是类似的!
				
			*/
   
		
public class 面试题 {
    public static void main(String[] args) {
		
		//这里就用到了cache 缓存池,因为这个自动装箱的对象在[-128,127]的范围外,所以i1,i2 拿到的不是同一个对象
        Integer i1 = 9527;
        Integer i2 = 9527;
        System.out.println(i1 == i2);//false 比较的是两个Integer对象的地址
        System.out.println(i1.equals(i2));//true Integer 的equals方法底层会先判断数据的类型是不是Integer类型,如果不是直接返回false,如果是的话就比较对象的内容是否相等

        System.out.println("------------------");

        Integer i3 = new Integer(123);
        Integer i4 = new Integer(123);
        System.out.println(i3 == i4);//false
        System.out.println(i3.equals(i4));//true

        System.out.println("------------------");
			//这里就用到了cache 缓存池,因为这个自动装箱的对象在[-128,127]的范围内,所以i5,i6 拿到的是同一个对象
        Integer i5 = 10;
        Integer i6 = 10;
        System.out.println(i5 == i6);//true
        System.out.println(i5.equals(i6));//true

        System.out.println("------------------");
		//这里就用到了cache 缓存池,因为这个自动装箱的对象在x<=127的范围外,所以c1,c2 拿到的不是同一个对象
        Character c1 = '中';
        Character c2 = '中';
        System.out.println(c1 == c2);//false
        System.out.println(c1.equals(c2));//true

        System.out.println("------------------");
//这里就用到了cache 缓存池,因为这个自动装箱的对象在x<=127的范围内,所以c3,c4 拿到的是同一个对象
        Character c3 = 'a';
        Character c4 = 'a';
        System.out.println(c3 == c4);//true
        System.out.println(c3.equals(c4));//true

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值