equals和==

什么是==

对于基本数据类型:值是否相等
对于引用变量:比较的是地址是否相同

什么是equals(只针对对象)
不能用于基本数据类型的比较
比较的是所指向的地址
源码:也就是说equals是特殊的==

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

在Java中8种基本数据类型:
浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值"true"和"false")

注意:
string类重写了equals方法,比较的是两个字符串是否相等,源码:

    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;
    }

在实际运用中,如果apple的sweet属性为null 则
apple.getSweet().equals("high")就会报空指针 因为空指针没有地址无法比较

必须使用"high".equals().(apple.getSweet()) 这样可以避免空指针问题,因为把字符串前置可以重写equals方法比较的是字符串

总结:

所有比较是否相等时,都是用equals 并且在对常量相比较时,把常量写在前面,因为使用object的equals  object可能为null  则空指针

在阿里的代码规范中只使用equals ,阿里插件默认会识别,并可以快速修改,推荐安装阿里插件来排查老代码使用“==”,替换成equals

不破不立,怕啥怼啥!
原文地址:https://www.cnblogs.com/yslu/p/10248498.html