概念:
- ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
- ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
- ==指引用是否相同, equals()指的是值是否相同
代码演示:
String x = "Hello word";
String y = "Hello word";
String z = new String("Hello word");
// ==
System.out.println(x == y); //true
System.out.println(x == z); //false
//equals
System.out.println(x.equals(y)); //true
System.out.println(x.equals(z)); //true
一. == 的解读:
在比较值的时候 == 对基本类型和引用类型的效果是不同的
- 基本类型: 比较的是值是否相同;
- 引用类型: 比较的是引用是否相同;
解读:
- x == y : 因为 x 和 y 指向的是同一个引用,所以比较的值相同;
- x == z : 因为
new String("Hello word")
开辟了一个新的内存空间
图片解读:
- String x = “Hello word” : 在String常量池里创建一个值为Hello word的常量并且指向Hello word
- String y = “Hello word” : 在String常量池里先扫描一下是否有值为Hello word的常量,如果有则指向Hello word 常量(如果没有则新创建一个值为 Hello word 的常量并指向Hello word)
- String z = new String(“Hello word”) : 使用关键字new 就会在堆空间里开辟一个专门的空间给 z 使用,并且把里面的值设置为 Hello word
举例解释:
前提 : 假如有室友 x y z
x : 买了一瓶洗发水
y : 看看这个寝室里有没有一瓶洗发水,如果有就用他的,没有就在买一瓶
z(new …) : 不管有没有,都新买一瓶(我不用你们的,你们也别用我的)
二. equals 的解读:
- equals : 是Object类中的方法,只能判断引用类型
正确示范:
Integer x = new Integer(1);
Integer y = new Integer(1);
System.out.println(x.equals(y)); //true
- equals默认判断的是地址是否相等,但是子类(String、Integer等)中往往重写该方法,用于判断内容是否相等
代码理解(一看就通):
- Objcet 中 equals 源码:
//即Object 的 equals 方法默认就是比较对象地址是否相同
//也就是判断两个对象是不是同一个对象
public boolean equals(Object obj) {
//两个引用用 == 运算符是判断地址是否相同
return (this == obj);
}
- String 中 equals 源码(已重写):
//解读Jdk的源码 String类的 equals方法
//把Object的equals方法重写了,变成了比较两个字符串值是否相同
public boolean equals(Object anObject) {
if (this == anObject) { //如果是同一个对象
return true; //返回true
}
if (anObject instanceof String) { //判断类型是否相同(anObject是不是String类型的子类)
String anotherString = (String)anObject; //向下转型
int n = value.length; //算出长度
if (n == anotherString.value.length) { //如果长度相同
//转成char数组
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //然后一个一个的比较字符
//如果在过程中发现一个不相同就返回false(两个字符串不相等)
if (v1[i] != v2[i])
return false;
i++;
}
return true; //如果上面的while循环执行完成都没有return,那么返回true
}
}
return false;//anObject 判断类型如果根本不是字符串,直接返回false
}
- Integer 中 equals 方法(已重写):
//从源码可以看到 Integer 也重写了Object的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) { //判断 obj 是不是 Integer 类型的
return value == ((Integer)obj).intValue();//如果当前Intergr的值 = 传过来的对象的具体的值,就返回true
}
return false;//如果在判断obj不是Integer类型的,那么返回false
}