欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

== 与 equals( )

程序员文章站 2022-04-07 21:00:25
...

== 与 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引用对象的地址是一样的,为什么呢?
== 与 equals( )

因为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对象的地址并不一样,所以引用的不是同一个对象;
== 与 equals( )

为什么呢?

因为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 的存储地址依然不同。
== 与 equals( )

new的方式创建对象

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

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