关于java中equals与==的区别的小实验

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的是二者是都为同一对象,是一种操作符。

做了几个小实验比较结果。

实验一:

String str1="ab";

String str2="ab";

System.out.PRintln(s1==s2);//true

System.out.println(str1.equals(str2));//true

这里的str1与str2都指向了常量池中的同一对象,所以System.out.println(s1==s2);返回为true,当然,str1与str2二者字符串的值也是相同的。

实验二:

1String str1="ab";2String str2="abc";3System.out.println(str1==str2);//false4System.out.println(str1.equals(str2));//false

这里的str1指向了字符串ab,初始时在常量池中并没有找到字符串abc,则开辟地址存储字符串abc,并将str2指向了abc字符串,所以str1与str2与并不是一个对象,他们的字符串值也不相同。

实验三:

1String str1="ab";2String str2="ab";3String str6=str2;4System.out.println(str1==str6);//true5System.out.println(str2==str6);//true6System.out.println(str1.equals(str6));//true7System.out.println(str2.equals(str6));//true

这里将str2的值赋值给str6,因为常量池中已经存在了ab这个字符串,所以str1、str2与str6共享了同样的对象,==与equals同样返回true

实验四:

1String str1=newString("abc");2String str2= "abc";3System.out.println(str1==str2);//false

创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。

以上代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。

实验五:

1String str1="ab";2String str3=newString("ab");3String str4=newString("ab");4System.out.println(str3==str4);//false5System.out.println(str1.equals(str3));//true6System.out.println(str3.equals(str4));//true

因为str3与str4的字符串的值是相同的,所以str3.equals(str4)为true,但是由于str3与str4指向的不是同一个对象,所以str3==str4返回是false。同样因为str1与str3字符串的值是相同的,尽管str1与str3指向的不是同一个对象,str1.equals(str3)同样返回的是true

实验六:

1String str1="ab";2String str3=newString("ab");3String str4=newString("ab");

String str5=str3;4System.out.println(str1.equals(str3));//true5System.out.println(str3.equals(str4));//true6System.out.println(str3.equals(str5));//true7System.out.println(str4.equals(str5));//true8System.out.println(str3==str5);//true9System.out.println(str4==str5);//false10System.out.println(str1==str5);//false11System.out.println(str1.equals(str5));//true

这里将str3赋值给str5,所以str3与str5指向了同一对象,这样str3==str5返回为true值,str3.equals(str5)同样返回true值。由于str4与str5指向的不是同一对象,所以str4==str5返回false。但是也是因为字符串的值是相同的,所以str4.euqals(str5)返回为true值。

下面是以上实验所有的代码:

1publicclassTest2{3publicstaticvoidmain(String[] args)4{5String str1="ab";6String str2="abc";7String str6=str2;8String str3=newString("ab");9String str4=newString("ab");10String str5=str3;11System.out.println(str1==str6);//true12System.out.println(str2==str6);//true13System.out.println(str1.equals(str6));//true14System.out.println(str2.equals(str6));//true15System.out.println(str1==str2);//true16System.out.println(str1.equals(str2));//true17System.out.println(str3==str4);//false18System.out.println(str1.equals(str3));//true19System.out.println(str3.equals(str4));//true20System.out.println(str3.equals(str5));//true21System.out.println(str4.equals(str5));//true22System.out.println(str3==str5);//true23System.out.println(str4==str5);//false24System.out.println(str1==str5);//false25System.out.println(str1.equals(str5));//true26}27}

将String类换成Integer包装类,测试代码及结果如下:

1classTestNumber2{3publicstaticvoidmain(String[] args)4{5Integer str1=23;6Integer str2=23;7Integer str6=str2;8Integer str3=newInteger(23);9Integer str4=newInteger(23);10Integer str5=str3;11System.out.println(str1==str6);//true12System.out.println(str2==str6);//true13System.out.println(str1.equals(str6));//true14System.out.println(str2.equals(str6));//true15System.out.println(str1==str2);//true16System.out.println(str1.equals(str2));//true17System.out.println(str3==str4);//false18System.out.println(str1.equals(str3));//true19System.out.println(str3.equals(str4));//true20System.out.println(str3.equals(str5));//true21System.out.println(str4.equals(str5));//true22System.out.println(str3==str5);//true23System.out.println(str4==str5);//false24}25}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航