equals底层代码

1.思考:equals代码怎么执行的?

package equals;

public class Test {

	public static void main(String[] args) {
		String name1="Tom";
		String name2="Tom";
		System.out.println(name1==name2);      //true
		System.out.println(name1.equals(name2));
	   }
}

2.equals底层代码

 public boolean equals(Object anObject) {         //name2传入equals方法,anObject指向name2对象,name2为上转型对象
	        if (this == anObject) {        //因为name1与name2都是采用直接赋值的方式创建的String类型的对象,所以是true
	            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;
	     }

2.思考:equals代码怎么执行的?

package equals;

public class Test {

        public static void main(String[] args) {
		String name1="Tom";
		String name2=new String("Tom");
		System.out.println(name1==name2);//false
		System.out.println(name1.equals(name2));
		}
	}

分析equals底层代码:

 public boolean equals(Object anObject) {                    //name2为上转型对象
	        if (this == anObject) {            //因为name1与name2地址不同,所以走接下来的代码
	            return true;
	        }
	        if (anObject instanceof String) {         //因为anObject参数指向name2对象,name2为String类型对象,所以anObject instanceof String  是 true  实例 intanceof 类
	            String anotherString = (String)anObject;           //因为anObject参数指向name2对象,name2为String类型对象,所以可以下转型
	            int n = value.length;        //因为value是全局变量,实质是this.value.length,name1 调用 equals,this即为name1,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字符组成的数组
	                int i = 0;
	                while (n-- != 0) {             //逐个字符比对
	                    if (v1[i] != v2[i])              //只要有一个比对失败则两个字符串一定不相同
	                        return false;
	                    i++;
	                }
	                return true;
	            }
	        }
	        return false;
	     }

3.思考:equals代码怎么执行的?

package equals;

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));
		}
	}

分析equals底层代码

 public boolean equals(Object anObject) {      //test传入equals方法,anObject指向test对象,test为上转型对象
	        if (this == anObject) {             //因为name1与test地址不同, 所以走下面的代码
	            return true;
	        }
	        if (anObject instanceof String) {                 //因为anObject参数指向test对象,test为Test类型对象,不是String类,所以anObject instanceof String 直接走到最后    return false;
	            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;
	     }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值