==是一个比较运算符
- ==:既可以判断基本类型,又可以判断引用类型。
- ==:如果判断基本类型,判断的是值是否相等。
- ==:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一对象。
- equals:是object类中的方法,只能判断引用类型。
- 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。(具体可查看jdk源码)。
名称 | 概念 | 基本类型 | 引用类型 |
== | 比较运算符 | 可以,判断的是值是否相等 | 可以,判断是不是同一对象 |
equals | 是object类中的方法 java类都可以使用 | 不可以 | 可以,默认判断的是地址是否 相等,子类中往往重写该方法, 用于判断内容是否相等。 |
//JDK源码Object类中的equals方法
//Object类中的equals方法默认就是比较对象地址是否相同,也就是判断两个对象是否是同一对象。
public boolean equals(Object obj) {
return (this == obj);//此时的==就是在判断引用类型,判断地址是否相等。
}
//JDK源码String类的equals方法
//String是object的子类,将equals方法重写,变成了比较两个字符串是否相同
public boolean equals(Object anObject) {
if (this == anObject) {//如果是同一个对象
return true;//返回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;//如果两个字符串的所有字符都相等,返回true
}
}
return false;//如果比较的不是字符串,直接返回false;
}
//JDK源码Integer类也重写了Object的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {//判断类型
return value == ((Integer)obj).intValue();//判断两个值是否相等。
}
return false;
}
package com.study.srv.demo4;
public class Demo01 {
public static void main(String[] args) {
N a = new N();
N b=a;
N c=b;
System.out.println(a==c);//true,比较引用类型,同对象
System.out.println(b==c);//true,比较引用类型,同对象
M d=a;
System.out.println(d==c);//true,比较引用类型,同对象
int num1=10;
double num2=10.0;
System.out.println(num1==num2);//true,基本数据类型,判断值是否相等
//
String str1 = new String("jack");//String类
String str2 = new String("jack");
System.out.println(str1==str2);//此时是判断是否是同一对象,false。
System.out.println(str1.equals(str2));//判断比较字符串是否相等,true。
Integer int1 = new Integer(100);//Integer类
Integer int2 = new Integer(100);
System.out.println(int1==int2);//此时是判断是否是同一对象,false。
System.out.println(int1.equals(int2));//判断两值是否相等,true。
}
}
class M{}
class N extends M{}
package com.study.srv.demo4;
public class Demo01 {
public static void main(String[] args) {
M m1 = new M();
m1.name="jack";
M m2 = new M();
m2.name="jack";
System.out.println(m1==m2);//此时的==是判断的是引用类型,判断的是地址是否相等。所以false
System.out.println(m1.equals(m2));//此时的equals调的是Object类的equals方法,值判断是否是同一对象,所以false
System.out.println(m1.name.equals(m2.name));
//此时的equals因为name属性是String类型,所以调的是String类中的equals方法,
// 先判断是否是同一对象,如不是在判断字符串的值是否相等,所以true。
}
}
class M{
public String name;
}