Java基本数据类型、引用类对比及实际项目高级应用 使用==与equal的机制与不同

Java编程中常常要用到两个变量或者对象的对比 非常容易入坑 但应用得当会非常给力!
首先,区分两个概念

  • 基本数据类型的对比(对比的是内容)
  • 引用类型(类、接口的对象)的对比(默认对比引用,即地址)

下面用代码举几个例子最直观

1.基本数据类型对比

对于基本数据类型,只有==对比,对比的是内容

       // 基本数据类型比较
        int a=1;
        int b=1;
        System.out.println("运行结果是");
        System.out.println(a==b);

运行结果是
true

2.两个内容相同的对象对比

对于两个内容相同的对象,== 和方法equals()对比的都是引用,而不是内容
但是我们可以通过重构Course类里的equals函数来实现我们想要的内容对比

如下所示

//      两个内容相同的Course类对象对比
        Course cr1=new Course("1","大学英语");
        Course cr2=new Course("1","大学英语");
        System.out.println("运行结果是");
        System.out.println(cr1==cr2);
        System.out.println(cr1.equals(cr2));

两个对象即使内容相同,但是占用两个不同的存储空间,因而==与equals()方法返回值都是false。为了实现我们想要的内容对比,我们需要在Course类中重构equals()方法;

3.实用技巧!重构类中的equals()方法

在Eclipse中,使用Source->generates equals生成对于某几个属性内容的equals()方法;

如下,重构equals()方法,对比Course类中id属性和name属性

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Course other = (Course) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

再次运行之前的代码

//      两个内容相同的Course类对象对比
        Course cr1=new Course("1","大学英语");
        Course cr2=new Course("1","大学英语");
        System.out.println("运行结果是");
        System.out.println(cr1==cr2);
        System.out.println(cr1.equals(cr2));

运行结果是
false
true
可见,这次调用的equals()方法对比的是两个对象的id和name属性;

4.更高级技巧! 只对比某一属性的equals()方法

现实工程中,我们常常只需要对比两个实例某一属性是否相同,比如两个人id可能不同; 但只要name相同我们就认为是同一个人,这时候需要重构某一属性的equals()方法;

如下所示是对比name属性的重构equals()方法

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Course other = (Course) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

这次,我们修改两个对象的id值,使其不同

//      两个内容相同的Course类对象对比 重构【name】属性的equals
        Course cr1=new Course("1","大学英语");
        Course cr2=new Course("3","大学英语");
        System.out.println("运行结果是");
        System.out.println(cr1==cr2);
        System.out.println(cr1.equals(cr2));

运行结果是
false
true
可见,即使id不同,只要name里的内容相同即返回true值;可见针对某一属性构造equals()方法还是非常实用的。

5.equals()是一切对比的基础,和CompareTo()是一切对比的根

Collection集合家族中的ArrayList HashSet Map中的HashMap 许多函数如contains indexof等等这些比较方法都是基于equals,因而
重构equals()方法相当于告诉Java程序什么才是等于
类似的比较大小的CompareTo()方法相当于告诉Java什么可以对比,对比结果什么时候是大于,等于和小于,之后我会详细说明CompareTo()的使用;
如果类中的equals()方法无法根据我们的意向设置好,其他的对比方法也就没有意义

6.未完待续-Integer等包装类及String类的==及equals函数

稍微复杂点的就是一些基本数据类型的包装类 尤其是String 一个类有时又有基本数据类型的属性 (因为不变变量机制 字符串池闹得)
内容比较多,见我的另一篇博客


本人比较爱折腾 钻研 欢迎有同样兴趣的伙伴共同交流!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值