# Java-Equals
# Java中如何比较两个值
# 区分equals和==
Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。所以我们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要在类中去看定义(equals的overridde)
equals()和"=="操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法,后者是操作符。由于Java不支持操作符重载(overloading),"=="的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden) 另一个需要注意的不同点是"=="习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较
总结:
- equals通常用来比较两个对象的
内容
是否相等,==用来比较两个对象的地址
是否相等。 - equals方法默认等同于"=="
Java中所有的对象都默认继承自Object
类,equals方法源码如下。当没有重写equals的方法时,若使用equals来判断两个对象的是否相等时(实际使用的是==
),只有这两个对象指向的是同一个内存地址时,才会返回true,否则即使内容完全相同但在内存中是两个不同的内存地址也是返回false
public boolean equals(Object obj) {
return (this == obj);
}
所以可以归为两种情况: 1、类未复写equals方法,则使用equals方法比较两个对象时,相当于==比较,即两个对象的地址是否相等。地址相等,返回true,地址不相等,返回false 2、类复写equals方法,比较两个对象时,则根据复写之后的逻辑判断。通常,我们会将equals复写成:当两个对象内容相同时,则equals返回true,内容不同时,返回false
# 在String类中的比较
Java中String类型具有一个equals
的方法可以用于判断两种字符串是否相等,但是这种相等又与运算符==
所判断的"相等"有所不同
String的equals函数只要两个字符串对象所存放的内容
相同时,不需要存放的内存地址相同,就返回true
那么在String类中的比较为什么不一样呢?
因为在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;
}
当我们使用字符串连接方式一般为+
或concat("substring")
的方式创建字符串时,都会构建一个新的String对象,即在内存中开辟一个新的地址来存放,所以这个时候即使内容相同。用==判断的话,也是返回false;当我们使用等号赋值时,若内存中有该字符串,则该变量指向此内存地址二不是重新创建一个,所以此时用==时会返回true
//测试string 类
String hello="hello";
String hel1=hello;
String hel2="hel";
String hel3=hel2+"lo";
String hel4=hel2.concat("lo");
//==等号测试
System.out.println(hello==hel1); //相等
System.out.println(hello==hel3); //不相等
System.out.println(hello==hel4); //不相等
System.out.println(hel3==hel4); //不相等 会开辟新的内存
//equals函数测试
System.out.println(hello.equals(hel1)); //相等
System.out.println(hello.equals(hel3)); //相等
System.out.println(hello.equals(hel4)); //相等
System.out.println(hel3.equals(hel4)); //相等
//StringBuilder测试
StringBuilder helloBuilder = new StringBuilder("hel");
System.out.println(helloBuilder.equals(hel2)); //不相等
在StringBuilder类中比较特殊,因为StringBuilder
并没有重写equals函数