Java杂谈来一发(五)== 和 equals

1、==

==是操作符,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址,也就是必须是同一个对象。

2、equals

如果没有对equals方法进行重写,比较的是引用类型的变量所指向的对象的地址;对于String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

注意:在重写equals方法的同时,必须重写hashCode方法,因为重写后equals的含义已经不一样了,equals是先比较hashCode,再进行equals比较,这是为了提高效率。如果不重写则可能会出现,equals相同,但hashCode不同,这会产生预期外的结果。

3、来个测试

 public static void main(String[] args) {
         
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        Long h = 2L;
         
        System.out.println(c==d);
        System.out.println(e==f);
        System.out.println(c==(a+b));
        System.out.println(c.equals(a+b));
        System.out.println(g==(a+b));
        System.out.println(g.equals(a+b));
        System.out.println(g.equals(a+h));
    }

结论是:

1)true。

2)false。原因是大小在128以内的对象,再次创建时是直接取缓存内的数据,也就是c、d的地址是同一个。

3)true。

4)true。原因还是128以内数据。

5)true。

6)false。原因是类型不同。

7)true。类型自动转换。

 

    // 附一段Long.java代码
    public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值