==号和equlas()

等号“==”和equals()的作用是用来判断两个数据是否相等,因为Java语言分为基本数据类型和引用数据类型。所以Java语言中对于数据的比较有以下三种情况。

1.基础数据类型的数据和基础数据类型数据的比较
2.引用数据类型的数据和基础数据类型数据的比较
3.引用数据类型的数据和引用数据类型数据的比较

等号“==”的作用是判断两个数据的数值是否相等。——通过数值来判断来个数据是否相等。

对于第一点,基础数据类型和基础数据类型的比较,只要它们都是数值数据类型且数值相等,它们就相等。即返回true,否则返回fals

对于第二点,引用数据类型数据和基础数据类型数据的比较,除非引用数据类型是基础数据类型数据的相应的包装类,否则比较起来没有任何意义,因为基础数据类型的数据是数值数据,而引用数据类型的数据是地址信息。就好比那一串数字和家的楼号进行比较,这毫无意义。而对于包装类和相应的基础数据类型之间的比较,也是比较它们之间的数值,只要类型相符且数值相等即可。例如Integer a = 2; 与 int b = 2; a和b通过等号"=="比较是相等的。

对于第三点,引用数据类型数据和引用数据类型数据之间的比较。
首先、等号只可以用于同类型或者类型上具有父子关系的两个对象。比较的内容也是两个引用类型变量所引用的对象的地址信息。
引用数据类型的作用主要是用来引用对象的,即可以通过引用数据类型的变量可以间接的访问到所引用的对象。所以,引用数据类型当中实际存储的是有关该对象的信息,这个信息就是该对象所在内存的位置信息,也称为该对象的地址。所以对于两个个引用数据类型的变量来说,除非它们引用的是同一个对象,即二者存储的是同一个对象所在内存的位置信息(地址),否则永远不可能相等。
例如:

class A{}
 public class Test
 {
 public static void main(String[] args){
 A a = new A();
 A b = new A();
 //a == b?因为a和b引用的不是一个对象,所以不相等。
 A c = a;
 //a == c因为a和c引用的是同一个对象,所以相等。
 }
 }

那么问题来了,对于引用数据类型数据与引用数据类型数据之间的比较,通过等号"=="来进行的话只能比较二者之间的地址。但是我们对希望的是比较引用数据类型变量所引用的对象的相关信息,很显然通过等号是没办法实现这一功能的。那么如何进行引用数据类型数据和引用数据类型数据之间的比较呢?

先总结下,对于等号来说,主要就是用来比较两个基础数据类型数据是否相等的,之于引用数据类型数据之间的比较就显得捉襟见肘了,这就需要用到equals()方法了。

equals()方法:
首先、equals()方法是Object类提供的一个普通成员方法(实例方法),因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等。但是从Object类继承的来的equals方法与使用等号运算符没有区别,即同样要求两个引用数据类型变量指向同一个对象才会返回true,否则返回false,唯一增加的就是即使不是同类或者具有父子关系的类也可以equals方法来进行比较,但是这没有什么实际意义。所以,想要更好的使用equals方法需要在子类中对该方法进行重写。

equals方法的重写技巧。
对于两个引用数据类型数据的比较,
首先先判断是否引用的是同一个对象,如果是肯定就相等。
再看两个引用类型数据的数据类型是否一致,不一致一般认为不相等。因为通常情况下,不同类型数据之间的比较意义不大,除非你有特殊需要。
最后,在类型相同的情况下,根据需求,对引用类型变量所引用对象中的成员进行相应的比较。
看下面的案例

public class Person
 {
 int age;
 public boolean equals(Object obj)//因为所有的类都间接或直接的继承了Object类,而下面的语句需要用到等号来比较两个引用变量是不是指
 {//向同一个对象,所以先转成Object类型可以弥补等号不能比较不是同类或没有父子继承关系类型引用变量的这一缺陷
 if (this == obj)//判断两个引用类型变量是否引用同一个对象。
 return true;//是、则返回true
 if(obj != 努力了&& obj.getClass() == Person.Class)//先判断obj不为空,然后,再看类型是否一致。
 {
 Person temp = (Person)obj;//强制类型转换,以实现多态
 if (this.age = obj.age)//看年龄是否一致
 return true;
 }
 return false;//不是同一个对象,也不是同一个类型则认为不想的。
 }
 }


对于上面的例子,根据需求,只要指向同一个对象,或者非空且属于同一个类型的前提下,age相等二者满足一个就像等,否则不相等。

通常而言,正确地重写equals()方法应该满足下列条件。(即相等的定义)
自反性,自己和自己相等,即x.equals(x);返回true
对称性:a = b则b = a,即a.equals(b)返回true则b.equals(a)返回true
传递性:a = b, b= c, a= c,即a.equals(b)返回true,b.equals©返回true,则a.equals©返回true
一致性,对于计算机程序而言,如果a.equals(b)相等,那么再二者数据不变得情况下,调用多少次都应该相等。
如果任意的a为非空,即a != null 则a.equals(null)返回false

最后,重写equals方法的要是,要根据你的具体要求,进行适当的调整。