Java中详述==与equals的区别

区别

== :对于基本数据类型而言,"= =" 是比较数据值是否相等;对于引用数据类型而言, ==比较对象地址是否相等。结果为boolean类型,相同为true,不同为false。
equals:Object类中比较地址是否相同,而String类中重写了equals方法,从而比较两个字符串内容是否相同。

代码展示分析

==代码部分

public class Test {

	public static void main(String[] args) {
	
	    double a = 10.0;
	    int b = 10;
	    System.out.println(a==b);
	    
	    String str1 = "Jim";
	    String str2 = "Tim";
	    System.out.println(str1==str2);
	}

}

代码结果为:
true
false
在第一类比较中,a与b的值相同,因此输出true;
在第二类比较中,str1与str2的内容存储在常量池中,而由于内容不同,因此在栈中储存的地址不同,在比较时由于地址不同,因此输出false。

equals代码部分

public class Test {
	String name;
		
	public static void main(String[] args) {
	
	    String name1="Tim";
	    String name2="Tim";
	    System.out.println(name1.equals(name2));
	    
	    Test test = new Test();
	    test.name ="Tim";
	    System.out.println("1+"+name1.equals(test));
	    System.out.println("2+"+name1.equals(test.name));
	    
	    String name3=new String ("Tom");
	    System.out.println(name1.equals(name3));
	}

}

代码结果为:
true
1+false
2+true
false
在第一类比较中,name1与name2 的内容相同,因此数据存储在常量池中的同一地址空间,所对应的地址相同。输出true。
在第二类中,为帮助更好理解String中被重写的equals方法,在main函数外定义一个name方法,并定义一个test对象,使其调用name方法为"Jim"。通过两次比较可以看出:test对象与name1的地址不同,内容不同而输出1+false,但是调用name方法为其赋值为"Jim",因此可以看到,虽然两者的地址不同,但由于字符串中的内容完全相同而输出2+true。
在第三类中,可以看出,由于name1与name3两者的地址不同,内容也不同,因此进行判定后输出的结果为false。

对于上述情况及判断方法,不妨将重写的String的equals摘出分析其运行判断原理,以最后一组判别为例。

	  public boolean equals(Object anObject) {//anObject储存上转型对象地址
	        if (this == anObject) {//比较地址是否相等,地址相等则储存数据相同,输出true
	            return true;
	        }
	        if (anObject instanceof String) {//判断anObject变量所指向的地址是否为String类型
	            String anotherString = (String)anObject;//多态的体现,将上转型对象转化为下转型对象;
	            int n = value.length;//给n赋值value的长度(value为name1的数组)
	            if (n == anotherString.value.length) {//判断value与anotherString.value(name2的数组)的长度是否相等
	                char v1[] = value;//name1的数组
	                char v2[] = anotherString.value;//name3的数组
	                int i = 0;//逐位判断name1和name3的字符是否相等
	                while (n-- != 0) {
	                    if (v1[i] != v2[i])//不同即输出false,结束判断
	                        return false;
	                    i++;
	                }
	                return true;
	            }
	        }
	        return false;
	    }*/

该代码块由两部分构成,第一个if语句判断两个字符串的地址是否相同,若相同,输出true,结束判定;若不同进入第二个if语句进行判断两个对象是否指向String类型,若不指向String类型,则输出false。若指向String类型,则继续进行如下操作:由于需要使用子类String中的 .length()方法,所以需要对anotherObject进行下转型操作,从而实现对比两字符串长度是否相同,若不想同,则输出false;若相同,则将两字符串分别转化为数组形式,并分别赋值给字符型数组v1[],v2[],从而进入while循环逐位进行判断对应字符是否相同,若出现字符不同,则输出false;若未出现字符不同,这说明字符分别对应相等,输出true,判断结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值