表面看都是判断两个“值”是否相等,其实不然
1、==:用来判断两个变量的值是否相等,即两个对象在内存中存储的值是否相等,内存中的值相等,那么内存的首地址就要相等,要比较两个基本类型的数据或两个引用变量是否 相等,只能用==操作符;
2、equals:用来判断两个独立对象的内容是否相等,即不管你在内存里是怎么存的,只要内容相同就相等,字符串的比较基本上都是使用equals方法。
1)、Object的equals源码分析:
从下面代码可以看出,Java基类中equals就等于==
public boolean equals(Object obj) {
return (this == obj);
}
2)、Integer的equals源码分析:
从下面代码中可以看出,对于基本数据类型,如果一个对象是该基本数据类型,并且他们在内存中的值相等,则他们equals。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
3)、String的equals源码分析:
从下面的代码中可以看出,对于一个独立对象,可以自己实现自己的equals方法,在Sting里,如果两个String在内存中的值不相等,但是只要他的字符的序列相等,那么他们相equals。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
4)、自定义的equals方法:
下面的内容,只要输入的内容有一个字符与zhangsan中的字符相同就相equals。
public class EqualsTest {
String name = "zhangsan";
public static void main(String[] args) {
EqualsTest et = new EqualsTest();
System.out.println(et.equals("白z白"));
}
@Override
public boolean equals(Object obj) {
if (this.name == obj) {
return true;
}
if (obj instanceof String) {
String objStr = (String) obj;
for (int i = 0; i < this.name.length(); i++) {
for (int j = 0; j < objStr.length(); j++) {
if(this.name.charAt(i)==objStr.charAt(j)){
return true;
}
}
}
}
return false;
}
}
3、例子分析:
public class EqualsTest {
public static void main(String[] args) {
System.out.println("1="+(aStr==bStr));
System.out.println("2="+(aStr.equals(bStr)));
String cStr ="foo";
String dStr ="foo";
System.out.println("3="+(aStr==cStr));
System.out.println("4="+(cStr==dStr));
System.out.println("5="+(cStr.equals(dStr))); }
}
输出结果分析:
1=false:因为在内存中存在两个foo,所以肯定首地址不同;
2=true:因为他们内容是相同的;
3=false:因为aStr是new出来的,那么每次他所在内存和其他任何一个不同;
4=true:其实是指向同一内存地址,也就是只有cStr开辟内存空间,dStr其实是直接指向cStr;
5=true:内容当然相等。
总结:
要比较两个基本类型(如byte、short 、int 、long 、float、double、char、boolean)的数据或两个引用变量是否相等,只能用==操作符;
字符串的比较基本上都是使用equals方法,因为两个字符串只要字符序列相等,也是equals的。