首页 > java > java相等性–双等号和equals方法
2016
12-01

java相等性–双等号和equals方法

双等号相等性判断

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合(引用)数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false
注意:双等号是java自身的机制,我们无法进行改变,但是equals方法和hashCode方法我们(或者java类库中的类)却可以覆写。

equals相等性判断

JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的。
但是某些java类库中提供的复合类型会覆写equals方法和hashCode方法,典型的如String,Integer,Date等。下面通过一个例子来进行说明:

示例

String s1 = “ok”;
String s2 = new String(“ok”);
System.out.println(s1==s2); // false 因为双等号是java的内部机制,只比较两个对象的内存地址值,显而易见s1与s2的内存地址值并不相同。
System.out.println(s1.equals(s2));//true 因为String类覆写了equals方法(方法的本质是对比两个字符串本身是否相同),所以这里认为两个对象相同。

System.out.println(s1.hashCode()); //3548
System.out.println(s2.hashCode()); //3548 //String类覆写了hashCode方法(产生hashCode的算法只跟字符串本身的内容有关),所以两个对象的hashCode相同。

补充

两个复杂数据类型的对象的比较可通过Obejcts(位于java.util包中,创建于jdk1.7)工具类来实现,通过第三方工具类的好处是可以不用考虑两个对象可能为空而导致的空指针的问题。
System.out.println(Objects.equals(s2,s1));//true

最后编辑:
作者:小马哥
大数据技术学习及实践者~

留下一个回复

你的email不会被公开。