1.本质上的区别,equals是方法,而==是操作符
2.==
==用于基础类型变量,如 short
、 int
、 long
、 float
、 double
,因为这些基本类型的变量没有 equals 方法。对于基本类型变量的比较,使用 == 比较, 一般比较的是它们的值。
3.equals()
对于引用类型的变量来说(例如 String 类)才有 equals 方法,因为 String 继承了 Object 类, equals 是 Object 类的通用方法。这里也分为两种情况:
(1)没有重写equals方法,则此时使用equals()方法和==等效,默认使用Object类中的equals()方法,都是比较内存中的存放地址
public boolean equals(Object obj) {
return (this == obj);
}
(2)重写了equals()方法,这里则要看重写的时候具体是怎么比较的,举例String中重写的equals(方法)
1.首先比较内存中的地址
2.若地址不相等,则比较长度,再比较字符,由此判断是否相等
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;
}
4.举例
在引用地址不相等的情况下,使用equals因为会在这个基础上再去比较值,所以返回true,而==则返回false。
String a = "Hello World";
String b = new String("Hello World");
String c = b; //引用传递
System.out.println("a == b:" + a == b); //false
System.out.println("b == c:" + b == c); //true
System.out.println("a == c:" + a == c); //false
System.out.println("a.equals(b):" + a.equals(b)); //true
System.out.println("b.equals(c):" + b.equals(c)); //true
System.out.println("a.equals(c):" + a.equals(c)); //true
最终的打印会是:
a == b:false
b == c:true
a == c:false
a.equals(b):true
b.equals(c):true
a.equals(c):true