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(1 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