package equals;
public class Test {
public static void main(String[] args) {
String name1="Tom";
String name2="Tom";
System.out.println(name1==name2);
System.out.println(name1.equals(name2));//思考:equals代码怎么执行的?
}
}
这种情况name1和name2的类别相同,均为String类,此时如何实现equals的比较过程呢?
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;
}
}
name2传入equals方法——>anObject指向name2对象——>name2为上转型对象
if (this == anObject) ;因为这种情况name1与name2地址不同——>==fasle
public class Test{
public static void main(String[]args){
String name1="Tom";
String name2=new String("Tom");
System.out.println(name1==name2);
System.out.println(name1.equals(name2));
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;
}
}
String name2=new String("Tom");的时候是创建了两个对象;
public boolean equals(Object anObject) //name2传入equals方法——>anObject指向name2对象——>name2为上转型对象(由String类到Object类)
if (this == anObject) //因为name1与name2地址不同——>==fasle在两个地址比较不相同之后,比较两个对象的内容是否一致
if (anObject instanceof String) //因为anObject参数指向name2对象——>name2为String类型对象——>anObject instanceof String true
String anotherString = (String)anObject;//因为anObject参数指向name2对象——>name2为String类型对象——>所以可以下转型(由Object类转为String类型)
int n = value.length;//因为value是全局变量——>实质是this.value.length——>name1 调用了 equals 方法——>this即为name1——this.value.length就是表示name1的字符有多少个
if (n == anotherString.value.length) //anotherString——>指向name2—>anotherString.value.length代表name2有多少个字符——>两个字符串相同,则长度一定相同——>n == anotherString.value.length非常重要
char v1[] = value;//由name1字符组成的数组
char v2[] = anotherString.value;//由name2字符组成的数组
while (n-- != 0) //逐个字符比对
if (v1[i] != v2[i]); return false;//只要有一个比对失败则两个字符串一定不相同
public class Test{
public static void main(String[]args){
String name1="Tom";
Test test= new Test();
//System.out.println(name1==test);//这条语句报错的原因javac在编译时已经知道连个类型不相同,所以编译出错
System.out.println(name1.equals(test));
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;
}
}
}
public boolean equals(Object anObject) //test传入equals方法——>anObject指向test对象——>test为上转型对象
if (this == anObject) { return true;//因为name1与test地址不同——>==fasle
if (anObject instanceof String) {//因为anObject参数指向test对象——>test为Test类型对象,不是 String类——>anObject instanceof String false