== 与 equals( )

== 与 equals( )

概述

  • 对于基本类型,== 判断两个值是否相等,基本类型没有equals( )方法;
  • 对于引用类型,== 判断两个变量是否引用的是同一个对象,而 equals( ) 判断两个变量引用的对象是否等价;

注意:
(1)基本类型不是对象(Object),equals( )方法是Object的方法;

Integer x = new Integer(66);
Integer y = new Integer(66);
System.out.println(x.equals(y)); // true
System.out.println(x == y);      // false

缓存池

Integer a = 127;
Integer b = 127;
System.out.println(a.equals(b)); //true
System.out.println(a==b);  //true

可以发现,a和b引用对象的地址是一样的,为什么呢?
图片

因为Integer有一个缓存池,缓存池的大小为-128~127,第一次赋值的时候会把127放入缓存池中,第二次赋值的时候则会直接从缓存池中取,因此a 和 b引用的对象都是缓存池中的127,这两个引用的对象是同一个。

Integer a = 128;
Integer b = 128;
System.out.println(a.equals(b));//true
System.out.println(a==b);//false

可以发现 a 和 b对象的地址并不一样,所以引用的不是同一个对象;
图片

为什么呢?

因为Integer对象有一个缓存池,大小为-128~127,在这之间的值,如果缓存池中有了该值,则先从缓存池中取,而这里的128已经超过了缓存池的大小范围之内,所以第二次的时候会新开辟一个地址进行存储, 所以 a == b为false。

Double、Float、Boolean包装类对象是没有缓存池的。

以Double为例:

Double e = 128.0;
Double f = 128.0;
System.out.println(e == f); //false

Double g = 126.0;
Double h = 126.0;
System.out.println(g == h); //false

如下图所示,发现126.0的时候 g 和 h 的存储地址依然不同。
图片

new的方式创建对象

Integer c = new Integer(125);
Integer d = new Integer(125);
System.out.println(c==d); //false

以 new 的方式,会创建一个新的对象,因此会开辟新的存储空间,所以 c 和 d 两个对象的地址并不相同,引用也就不是同一个对象了。
图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值