那么,我们今天来说说equels,话不多说,上代码:

/**
 * @author Shusheng Shi
 * @since 2017/8/19 11:20
 */
public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

     public static void main(String[] args) {
        String s1 = new String("100");
        String s2 = new String("100");
        System.out.println(s1.equals(s2));

        Integer integer = new Integer("123");
        Long lon = new Long("123");
        System.out.println(integer.equals(lon));

        Person person1 = new Person("张三");
        Person person2 = new Person("张三");
        System.out.println(person1.equals(person2));
    }
}

执行一下,结果如下:

true
false
false

Process finished with exit code 0

在引用类型中:

  • “==”是比较两个引用是否指向堆内存里的同一个地址(同一个对象)
  • equals是一个普通的方法,该方法返回的结果依赖于自身的实现

我们先看一下Person这个类,并没有equals方法呀,那为什么不报错呢?在Java中,如果一个类没有继承其它类,那么它默认继承Object这个类,打开Object这个类看一下,发现如下代码,Person这个类的equals方法就继承自这里

 public boolean equals(Object obj) {
        return (this == obj);
 }

很简单,就一句代码,判断两个引用是否指向同一个对象,两个Person对象在堆内存中的表现如下图所示:
说说equals()  (上)_数组

所以代码person1.equals(person2)等同于person1 == person2,当然打印出来的结果是false。我们再来看看Integer这个类, equals的实现如下:

  public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
  }

当代码执行到System.out.println(itr.equals(lon))时,会判断传入的lon这个对象是否是Integer类型,这里的lon是Long类型,所以打印出来的结果当然是false了。

最后是我们String的实现

public boolean equals(Object anObject) {
        //如果两个对象指向同一个引用,直接返回true
        if (this == anObject) {
            return true;
        }
        //1.判断传入的对象是否为String类型
        //2.判断这两个字符串底层cahr数组的长度是否一致
        //3.循环判断底层数组里的每一个char字符,看值是否都相等
        //三个条件都满足,返回true,否则false
        if (anObject instanceof 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;
 }

当代码执行到:System.out.println(s3.equals(s4)),由于字符串底层char数组里存的都是{‘1’,’0’,’0’}当然打印出来是true了。