Java学习心得之equals方法

来源:互联网 发布:梦幻西游mac 编辑:程序博客网 时间:2024/05/16 00:33

一、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);

执行完之后内存如下:



我们可以看到,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    }



原创粉丝点击