我是 啤酒就辣条,一个Java。两种相等
学而时习之,不亦说乎?希望通过博客的形式,总结、分享,梳理自己、帮助他人。
另外,啤酒就辣条,味道不错哦~
==
是比较两个对象引用所指向的地址是否相同。equals
本身等同于==
,但是由于经常被重写,所以常被用来判断两个对象内容是否相同。示例展示
首先新建一个类CPU
public class CPU {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class EqualsTest {
public static void main(String[] args) {
CPU cpu1 = new CPU();
cpu1.setName("因特尔");
CPU cpu2 = new CPU();
cpu1.setName("因特尔");
CPU cpu3 = cpu1;
System.out.println(cpu1 == cpu2);
//false
System.out.println(cpu1.equals(cpu2));
//fasle
System.out.println(cpu1 == cpu3);
//true
System.out.println(cpu1.equals(cpu3));
//true
}
}
直接看,
==
和equals
等价,这是为什么呢?要看一下万物之祖Object
public class Object {
public boolean equals(Object obj) {
return (this == obj);
//所以说,`equals`本身等同于`==`
}
}
常常被重写的equals
【【java基础】==和equals】我们常常需要比较两个对象内容是否相同,而不是他们的地址。所以,JDK中多数类都重写了equals方法。
// 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;
}
// Integer 的 equals方法比较的是数值内容本身
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value =https://www.it610.com/article/= ((Integer)obj).intValue();
}
return false;
}
public class EqualsTest {
public static void main(String[] args) {
Integer integer1 = new Integer(500);
Integer integer2 = new Integer(500);
System.out.println(integer1 == integer2);
//fasle
System.out.println(integer1.equals(integer2));
//true
}
}
从上面的例子可以看出
equals
此时比较的是数值内容。关于Integer的小秘密
我们将上面的例子稍微改造一下:
public class EqualsTest {
public static void main(String[] args) {
Integer integer1 = 500;
Integer integer2 = 500;
System.out.println(integer1 == integer2);
//false
System.out.println(integer1.equals(integer2));
//true
}
}
和上面的例子相比,此时integer1和integer2需要
装箱
操作,但是不影响结果。but,我们将数值调小一点:
public class EqualsTest {
public static void main(String[] args) {
Integer integer1 = 50;
Integer integer2 = 50
System.out.println(integer1 == integer2);
//true
System.out.println(integer1.equals(integer2));
//true
}
}
此时发现
integer1 == integer2
居然相等,说明指向同一块内存。这一现象的原因是:Integer的[-128,127]这个范围的数值缓存在常量池,所以无论多少引用,只要数值在这个范围内,引用都指向同一地址。所以对于
Integer
比较数值大小,无论数值是否需要经历装箱,都是用equals比较大小。推荐阅读
- Java毕业设计项目实战篇|健康菜谱微信小程序+项目前后台源码(JavaSSM+Mysql)
- 面试|史上最详细的一线大厂Mysql面试题详解
- java|互联网公司都怎么实现分页的,拿 MySQL 使劲Limit()
- Spring|XxlJob分布式任务调度平台
- Spring|@Async 没有异步执行
- JAVA随记|Springboot吞吐量优化解决方案
- 人工智能|特斯拉新四化研究(电动化和自动化上一路领先,下一步是共享化)
- Python Json使用
- Redis|基于Redis+Lua的滑动窗口式限流方案