Java基本数据类型、引用类对比及实际项目高级应用 使用==与equal的机制与不同
2017-06-01 23:36
741 查看
Java编程中常常要用到两个变量或者对象的对比 非常容易入坑 但应用得当会非常给力!
首先,区分两个概念
基本数据类型的对比(对比的是内容)
引用类型(类、接口的对象)的对比(默认对比引用,即地址)
下面用代码举几个例子最直观
运行结果是
true
但是我们可以通过重构Course类里的equals函数来实现我们想要的内容对比
如下所示
两个对象即使内容相同,但是占用两个不同的存储空间,因而==与equals()方法返回值都是false。为了实现我们想要的内容对比,我们需要在Course类中重构equals()方法;
如下,重构equals()方法,对比Course类中id属性和name属性
再次运行之前的代码
运行结果是
false
true
可见,这次调用的equals()方法对比的是两个对象的id和name属性;
如下所示是对比name属性的重构equals()方法
这次,我们修改两个对象的id值,使其不同
运行结果是
false
true
可见,即使id不同,只要name里的内容相同即返回true值;可见针对某一属性构造equals()方法还是非常实用的。
重构equals()方法相当于告诉Java程序什么才是等于
类似的比较大小的CompareTo()方法相当于告诉Java什么可以对比,对比结果什么时候是大于,等于和小于,之后我会详细说明CompareTo()的使用;
如果类中的equals()方法无法根据我们的意向设置好,其他的对比方法也就没有意义
内容比较多,见我的另一篇博客
本人比较爱折腾 钻研 欢迎有同样兴趣的伙伴共同交流!
首先,区分两个概念
基本数据类型的对比(对比的是内容)
引用类型(类、接口的对象)的对比(默认对比引用,即地址)
下面用代码举几个例子最直观
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 一个类有时又有基本数据类型的属性 (因为不变变量机制 字符串池闹得)内容比较多,见我的另一篇博客
本人比较爱折腾 钻研 欢迎有同样兴趣的伙伴共同交流!
相关文章推荐
- Java 基础知识 8种基本数据类型 equal 与==区别 Switch 使用
- java语言-基础(参数的值传递机制(基本数据类型与引用数据类型))
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- 加强eclipse的使用技巧。可变参数。基本数据类型自动装箱和拆箱。枚举。反射。数组反射的应用。ArrayList和HashSet。JavaBean
- java学习-JAVA基本排序法示例,JAVA数据类型转换 ,ArrayList用法,Calendar 简单应用
- 作为引用数据类型,数组变量与基本数据类型变量的使用有哪些区别?
- java中的基本数据类型和引用数据类型
- java 入门 二(基本数据类型与引用数据类型的区别)
- JAVA---基本数据类型和引用数据类型传递值得案例
- Java 数据类型(基本数据类型、引用数据类型)
- Java中有关基本数据类型和包装类的区别和使用标准
- JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)
- java中引用数据类型和基本数据类型的一些区别(貌似不完整,但会有些启示)
- java基本数据类型:基本数据类型和引用类型
- Java程序员.回头学C/C++ 之 Java&C基本数据类型大对比
- JAVA高级01_04 基本数据类型的对象包装类 2011-4-20
- Java中基本数据类型和包装数据类型在Hibernate中使用
- Java数据类型(基本数据类型和引用数据类型)
- 使用EasyWechat开发java微信公众平台应用(二)——发送不同类型的消息
- java中基本数据类型与对象引用类型的默认初始化值学习