Java中==与equals的区别及理解,及项目实战
本文上半部分参考转帖,感谢。
一、java当中的数据类型和“==”的含义
基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(),比较的是他们的值。 复合数据类型(类):当他们用()进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。 注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。
二、equals()方法介绍
JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被复写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。 所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。
注意:null.equals()会报空指针异常。
实战应用:
存在两张表格表格A和表格B。
表格A中的日期要和B中的日期一致,否则报错。
因为原来开发过程设置为表格A中的日期非空,也就不存在这次的问题。
但是在这次在测试过程中存在大量的日期为空数据,多次报错难以使用。
于是把日期对象设置为null,然后在导入B表格时日期要进行校验,日期不同则导入失败。
//表A实例化对象finPro,表B实例化对象validate
//修改前
if(finPro.getTime().equals(validate.get(pid).getStarttime())){
failList.add(pid);
}
//报错空指针异常
//为实现比较null==null,第一次修改
if(finPro.getTime()!=validate.get(pid).getStarttime()){
failList.add(pid);
}
//报错所有时间都不匹配,因为在不同对象下面存放的时间的内存地址不同所以无法比较
//修改后
if(finPro.getTime()!=null && !finPro.getTime().equals(validate.get(pid).getStarttime())){
failList.add(pid);
}else if(finPro.getTime()==null&&validate.get(pid).getStarttime()!=null){
failList.add(pid);
}
//在finPro.getTime()!=null走原来判断模式,因为这里的equals走的是Date类下面重写的equals方法所以可以对时间进行比较
//当finPro.getTime()==null,只需要比较validate.get(pid).getStarttime(),如果它为null说明两表时间相同,如果!=null说明两表时间不同,可以在控制台输出错误。