Java学习心得之equals方法

时间:2021-10-09 23:24:24

一、equals方法简介

equals方法是Object类中的一个方法,通过重写该方法提供判断对象是否相等的逻辑。

1.euqals用法

Dog实体类:

public class Dog {
private String color;
private int weight;
private int height;

public Dog(String color,int weight,int height){
this.color = color;
this.weight = weight;
this.height = height;
}
}


测试:
 
 public static void main(String[] args) {	        /**	         * 这里使用构造方法Dog()在堆内存里面new出了两只狗,	         * 这两只狗的color,weight,height都是一样的,但是在堆内存中它们的物理地址是不一样的。	         * 我们知道用==,equals(没有重写该方法),比较两个对象时,比较的是两个对象的地址是否一样。	         * 因此,在这里两只狗永远不会相等。	         */	        Dog d1 = new Dog("black", 5,30);	        Dog d2 = new Dog("black", 5,30);	        System.out.println("d1==d2的结果是:"+(d1==d2));//false	        System.out.println("d1.equals(d2)的结果是:"+d1.equals(d2));//false	 }

2.内存分析

程序:

 Dog d1 = new Dog("black", 5,30);
 Dog d2 = new Dog("black", 5,30);

执行完之后内存如下:

Java学习心得之equals方法


我们可以看到,d1和d2指向两个不同的地址,而==和equals(未重写)只是比较两个对象在内存中的地址是否一样,因此不能准确的判断两个对象

是否想的(d1和d2指向同一对象时,结果返回的是true)。那么如何去比较两个对象是否相等的呢?在现实生活中,我们比较两只狗是否一样,往往是通过比较

它们的属性来判断的,比如两只狗的颜色、体重、身高一样的话,我们会说这两只狗长得一样,同样的道理,在Java中比较两个对象是否相等,也可以比较两个对象之间的属性全部或部分相等来实现。这个时候我们可以通过重写equals方法,来实现判断逻辑,如下:


public class Dog {
private String color;
private int weight;
private int height;

public Dog(String color,int weight,int height){
this.color = color;
this.weight = weight;
this.height = height;
}
/**
* 这里是重写相等从Object类继承下来的equals()方法,改变这个方法默认的实现,
* 通过我们自己定义的实现来判断决定两个对象在逻辑上是否相等。
* 这里我们定义如果两只狗的color,weight,height都相同,
* 那么我们就认为这两只狗在逻辑上是一模一样的,即这两只狗是“相等”的。
*/
public boolean equals(Object obj){
if(obj==null){
return false;
}
if(obj == this){
return true;
}
if(obj instanceof Dog){
Dog d = (Dog)obj;
if(d.color.equals(this.color) && d.weight==this.weight&&d.height==this.height){
return true;
}
}
return false;
}
}

测试:

 public static void main(String[] args) {
/**
* 我们看到,同样比较d1和d1,用equals的时候结果发生了变化
*/
Dog d1 = new Dog("black", 5,30);
Dog d2 = new Dog("black", 5,30);
System.out.println("d1==d2的结果是:"+(d1==d2));//false
System.out.println("d1.equals(d2)的结果是:"+d1.equals(d2));//true
}


3.如何比较两个字符串是否相等

细心的朋友会发现,在上面的例子中,比较两只狗的颜色,用的是equals方法,是的字符串的比较用的就是equals方法。那么,有人会问我们根本没有重写

字符串的equals方法,为什么会这样呢?其实,在Java中String的equals,Java语言的开发者已经帮我们写好了,当然除了String类,还有其他部分类的equals

方法也已经写好了,有兴趣的可以自己去了解。以下是String类中equals方法的源码:

 public boolean equals(Object anObject) {
if (this == anObject) {//如果是同一个对象,返回true
return true;
}
if (anObject instanceof String) { //判断是否是string对象
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {//判断长度是否一致
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])//比较每个字符是否一样
return false;
i++;
}
return true;
}
}
return false;
}

例子:

  public static void main(String args[]){
/**
* String字面量和new出来对象比较的区别
* 下面例子中:
* 当两个字符串都是字面量时,==和equals比较是没有区别的,因为此时s1和s2指向的是同一个对象,在常量池中
* 当两个字符串是new出来的时候,==和equale比较的结果是不一样的,因为new出来的是一个新的对象,必须用equals方法比较
*
* 注意:判断字符串之间是否相等,用equal方法,切记。
*
*/
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("s1 == s2的结果是:"+(s1 == s2));//true
System.out.println("s1.equals(s2)的结果是:"+s1.equals(s2));//true
System.out.println("s2 == s3的结果是:"+(s2 == s3));//false
System.out.println("s2.equals(s3)的结果是:"+s2.equals(s3));//true
System.out.println("s3 == s4的结果是:"+(s3 == s4));//false
System.out.println("s3.equals(s4)的结果是:"+s3.equals(s4));//true
}