equals和==小结
1. ==简单介绍
==
比较的是两个比较对象的内存地址是否相同,当两个对象的内存地址相等时,返回 true,否则返回 false;
解释:
==
比较的是两端操作数(通常是对象的引用)是否是同一个对象,即在堆中是否有相同的内存地址,比较的是内存地址的值;- 基本数据类型中,比较值是否相等,如
int i =10;
,
double d= 10.0;(i==d)
为true
; - 两边的操作数必须是同一类型,或者父子类,否则不能通过编译
2. equals
equals
比较的是两个对象的实际内容是否相等,所有对象都适用,但是不适用于 基本类型,基本类型使用 ==
和 !=
即可。
以下为 Object
类中 的equals
源码,可以发现equals
方法默认返回的还是 ==
的判断(即是否为同一对象),由于所有的类都继承java.lang.Object
,所以使用 equals
方法时,若没有重写equals
方法,则equals
和==
没有区别;
public boolean equals(Object obj) {
return (this == obj)//注意
}
3. String和自己创建的类
String 类型有两种初始化方法
①:String str = new String("xx");
②String str2 = "xxx";
这两种方法有着很大的不同,先看第一种,使用 new 来初始化 String 类,与其他普通对象没有区别,都是在堆中开辟一段内存空间,存储字符串 “xx”,str 指向此内存地址;
第二种方法,首先会在 JVM 内部发生字符串拘留,即当声明这样的一个字符串后,JVM 会在常量池中先查找有没有一个值为 “xxx” 的对象,如果有,就会把它赋给当前引用,如果没有,则在常量池中新创建一个 “xxx” 对象,当下一次还有使用这种方法初始化字符串为 “xxx”时,会直接将此字符串的引用执行之前的 “xxx” 对象,此时多个引用指向同一个对象
以下是使用 == 比较 String 对象
@Test
public void test1(){
String str11 = new String("初始化字符串");
String str12 = new String("初始化字符串");
String str21 = "初始化字符串";
String str22 = "初始化字符串";
//使用 == 比较使用 new 关键字初始化的字符串对象是否为同一对象
System.out.println(str11==str12);// false 非同一对象
//使用 == 比较使用直接赋值初始化的字符串对象是否为同一对象
System.out.println(str21==str22); // true 同一对象
}
String 使用 equals 比较
public void test2(){
String str11 = new String("初始化字符串");
String str12 = new String("初始化字符串");
String str21 = "初始化字符串";
String str22 = "初始化字符串";
//使用 equals 比较使用 new 关键字初始化的字符串对象 内容 是否相等
System.out.println(str11.equals(str12));// true 内容相等
//使用 equals 比较使用直接赋值初始化的字符串对象 内容 是否相等
System.out.println(str21.equals(str22)); // true 内容相等
//使用 equals 比较使用两种不同初始化的字符串对象 内容 是否相等
System.out.println(str11.equals(str21));// true 内容相等
}
因为 String 类重写了 equals 方法,所以使用 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;
}
自建一个类,但是不重写 equals 方法
class value {
int i;
}
@Test
public void test3() {
//实例化两个自定义类对象
value v1 = new value();
value v2 = new value();
//将两个对象的成员变量赋相同的初值
v1.i = v2.i = 10;
System.out.println(v1.equals(v2));//false
}
因为自定义的类 value 未覆盖 Object 的 equals 方法,所以使用 equals 默认返回的是 == 的比较结果。