== 与 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引用对象的地址是一样的,为什么呢?
因为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 两个对象的地址并不相同,引用也就不是同一个对象了。
下一篇: ROS的CMakeList编写