“==” 运算的是两个引用对象是否在堆内存中指向同一个地址。
在上例中,s1、s2分别新开辟了一个String类型空间,存储相同的值100。
equal方法源码:
//String类中的equals
public boolean equals(Object anObject) {
//判断两个引用是否指向同一个内存地址,是,返回true
if (this == anObject) {
return true;
}
//如果不是指向同一个地址
if (anObject instanceof String) {//1、判断传入的参数是否是String对象
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {//2、判断两个String对象的长度是否相等
char v1[] = value;//将String对象转为字符数组
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//3、循环遍历两个字符数组的每个值是否相等。
if (v1[i] != v2[i])
return false;
i++;
}
return true;//若遍历结束,各个值都相等,返回true
}
}
return false;
}
//Object类中的equals
public boolean equals(Object obj) {
return (this == obj);//相当于判断两个对象的引用是否指向同一个地址
}
//Integer类中的equals
public boolean equals(Object obj) {
if (obj instanceof Integer) {//1、判断传入参数是否为Integer
return value == ((Integer)obj).intValue();//2、判断值是否相等
}
return false;
}
测试:
package lesson02;
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public static void main(String args[]) {
String s1 = new String("100");
String s2 = new String("100");
System.out.println("String equals" + s1.equals(s2));
if(s1 == s2)
System.out.println("String '==' yes");
else
System.out.println("String '==' No");
Person p1 = new Person("Amy");
Person p2 = new Person("Amy");
System.out.println("Object" + p1.equals(p2));
if(p1 == p2)
System.out.println("Object '==' yes");
else
System.out.println("Object '==' No");
Integer a1 = new Integer("123");
Integer a2 = new Integer("123");
System.out.println("Integer equals" + a1.equals(a2));
if(a1 == a2)
System.out.println("Integer '==' yes");
else
System.out.println("Integer '==' No");
}
}