当前位置 博文首页 > 一个搬砖的农民工的博客:java中equals和==的区别

    一个搬砖的农民工的博客:java中equals和==的区别

    作者:[db:作者] 时间:2021-07-29 18:42

    1.equals

    1.equals方法在Object类中判断的是地址,以下是Object源码

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

    2.equals在String类中判断的是内容,以下是String源码

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            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;
        }
    

    因此,我们可以发现,如果是继承Object类但是没有重写equals方法的话,判断的是地址(也就是说和==作用是一样的),如果是像String类一样重写了equeals方法的判断的就是内容。

    例子1:

    public static class User {
            private String id;
            private String name;
        }
    
    		User aa = new User();
            User bb = new User();
            aa.id = bb.id = "123";
            // 因为User是继承的Object,并且没有重写equals方法,所以判断的是地址,而两个不同的对象地址是不一样的,所以为false
            System.out.println(aa.equals(bb)); // false
    

    如果我在User上加一个@Data注解

    @Data
    public static class User {
            private String id;
            private String name;
        }
    

    那么System.out.println(aa.equals(bb)); 得到的就是true了,因为@Data注解已经帮我重写了equals方法,或者你自己重写也可以。

    例子2:

    		String a = "apple";
            String b = "apple";
            StringBuffer c = new StringBuffer("apple");
            // 因为StringBuffer没有重写equals方法,所以调用的是Object类的方法
            System.out.println(a.equals(b)); // true
            System.out.println(a.equals(c)); // false
    

    3.equals方法不能用于基础变量,如int,char等,因为这是Object的方法,必须继承Object或者子类

    2.==

    ==判断的是地址

    String a = "abc";
    String b = "abc";
    String c = new String("abc");
    // 因为直接定义的是放在同一个地址的常量池中,new出来的是重新创建的一个地址
    System.out.println(a==b); // true
    System.out.println(a==c); // false
    

    注:String大小是固定的,若

    String s = "123";
    s = s + "321";
    

    这里不是在原来基础上改变值,而是重新创建了一个地址存放值

    cs