对象的比较 ==和equals()

结论:

  一般 == 表示完全相同 equals表示对象内容相同

1、“==”底层实现

  “==”默认比较内存地址,即是否是同一对象。如果是基本类型则表示值相等

2、equals底层实现

  Object类中的实现:也是完全相等

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

3、String类中重写equals方法

  1.若是同一对象则相等

  2.若不是同一对象且是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;
    }

补充:

JDK提供的一些类,如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals (y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。

易错提醒

1、为什么Java中1000==1000为false而100==100为true?(也可以参考自动装箱)

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

posted @ 2019-01-09 13:20  懒懒惰惰一只猫  阅读(979)  评论(0编辑  收藏  举报