== 和 equals方法

== 是运算符

== 是运算符,比较的是堆内存中地址是否相等
对于基本数据类型或常量字符串来说,可以直接用来比较值是否相等(基本数据类型 或者 常量字符串在方法区中的常量池里面以HashSet策略存储起来的,一个常量只会对应一个地址);
对于引用数据类型(类、接口、数组)来说,用来比较是否是同一对象(地址是否相同)

equals() 是方法

equals() 是Object类的方法,底层也是用的 ==

Object:

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

如果需要比较值是否相同,则需要重写equals()方法
例如String类的equals方法

String:

public boolean equals(Object anObject) {
        if (this == anObject) { // 首先比较引用对象的地址
            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;
    }

测试下
撸代码:

 @Test
    public void testString(){

        System.out.println("基本数据类型:");
        System.out.println(1 == 1); // true
        System.out.println('a' == 'a'); //true

        System.out.println("引用数据类型:");
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1 == s2); // false
        System.out.println(s1.equals(s2)); //true  String类中equals()方法被重写

        System.out.println("自定义类 重写equals()方法:");
        Person na2 = new Person(12, "na");
        Person na1 = new Person(12, "na");
        System.out.println(na1 == na2); // false
        System.out.println(na1.equals(na2)); //true,如果不重写equals方法。默认是从Object类继承过来的方法,则返回false
    }

自定义类重写equals方法

自定义类:

class Person{
    int age;
    String name;

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

    /**
     * 如果不重写equals()方法,则还是用父类Object的方法
     * @param o
     * @return
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}

posted on 2021-11-22 17:48  快乐撸代码  阅读(67)  评论(0编辑  收藏  举报

导航