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二者字符串的值也是相同的。
实验二:
1 String str1="ab";2 String str2="abc";3 System.out.println(str1==str2);//false4 System.out.println(str1.equals(str2));//false
这里的str1指向了字符串ab,初始时在常量池中并没有找到字符串abc,则开辟地址存储字符串abc,并将str2指向了abc字符串,所以str1与str2与并不是一个对象,他们的字符串值也不相同。
实验三:
1 String str1="ab";2 String str2="ab";3 String str6=str2;4 System.out.println(str1==str6);//true5 System.out.println(str2==str6);//true6 System.out.println(str1.equals(str6));//true7 System.out.println(str2.equals(str6));//true
这里将str2的值赋值给str6,因为常量池中已经存在了ab这个字符串,所以str1、str2与str6共享了同样的对象,==与equals同样返回true
实验四:
1 String str1= new String("abc");2 String str2= "abc";3 System.out.println(str1==str2);//false
创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。
以上代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
实验五:
1 String str1="ab";2 String str3=new String("ab");3 String str4=new String("ab");4 System.out.println(str3==str4);//false5 System.out.println(str1.equals(str3));//true6 System.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
实验六:
1 String str1="ab"; 2 String str3=new String("ab"); 3 String str4=new String("ab");
String str5=str3; 4 System.out.println(str1.equals(str3));//true 5 System.out.println(str3.equals(str4));//true 6 System.out.println(str3.equals(str5));//true 7 System.out.println(str4.equals(str5));//true 8 System.out.println(str3==str5);//true 9 System.out.println(str4==str5);//false10 System.out.println(str1==str5);//false11 System.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值。
下面是以上实验所有的代码:
1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 String str1="ab"; 6 String str2="abc"; 7 String str6=str2; 8 String str3=new String("ab"); 9 String str4=new String("ab");10 String str5=str3;11 System.out.println(str1==str6);//true12 System.out.println(str2==str6);//true13 System.out.println(str1.equals(str6));//true14 System.out.println(str2.equals(str6));//true15 System.out.println(str1==str2);//true16 System.out.println(str1.equals(str2));//true17 System.out.println(str3==str4);//false18 System.out.println(str1.equals(str3));//true19 System.out.println(str3.equals(str4));//true20 System.out.println(str3.equals(str5));//true21 System.out.println(str4.equals(str5));//true22 System.out.println(str3==str5);//true23 System.out.println(str4==str5);//false24 System.out.println(str1==str5);//false25 System.out.println(str1.equals(str5));//true26 }27 }
将String类换成Integer包装类,测试代码及结果如下:
1 class TestNumber 2 { 3 public static void main(String[] args) 4 { 5 Integer str1=23; 6 Integer str2=23; 7 Integer str6=str2; 8 Integer str3=new Integer(23); 9 Integer str4=new Integer(23);10 Integer str5=str3;11 System.out.println(str1==str6);//true12 System.out.println(str2==str6);//true13 System.out.println(str1.equals(str6));//true14 System.out.println(str2.equals(str6));//true15 System.out.println(str1==str2);//true16 System.out.println(str1.equals(str2));//true17 System.out.println(str3==str4);//false18 System.out.println(str1.equals(str3));//true19 System.out.println(str3.equals(str4));//true20 System.out.println(str3.equals(str5));//true21 System.out.println(str4.equals(str5));//true22 System.out.println(str3==str5);//true23 System.out.println(str4==str5);//false24 }25 }
新闻热点
疑难解答