有两种方式可用于对象间的比较,它们是“= =”运算符与equals()方法,“= =”操作符用于比较两个对象的内存地址值是否相等,equals()方法用于比较两个对象的内容是否一致。
范例:TestEquals.java
01 public class TestEquals
02 {
03 public static void main(String[] args)
04 {
05 String str1 = new String("java") ;
06 String str2 = new String("java") ;
07 String str3 = str2 ;
08 if(str1==str2)
09 {
10 System.out.println("str1 == str2");
11 }
12 else
13 {
14 System.out.println("str1 != str2") ;
15 }
16 if(str2==str3)
17 {
18 System.out.println("str2 == str3");
19 }
20 else
21 {
22 System.out.println("str2 != str3") ;
23 }
24 }
25 }
输出结果:
str1 != str2
str2 == str3
由程序的输出结果可以发现,str1不等于str2,有些读者可能会问,str1与str2的内容完全一样,为什么会不等于呢?读者可以发现在程序的第5和第6行分别实例化了String类的两个对象,此时,这两个对象指向不同的内存空间,所以它们的内存地址是不一样的。这个时候程序中是用的“==”比较,比较的是内存地址值,所以输出str1!=str2。程序第7行,将str2的引用赋给str3,这个时候就相当于str3也指向了str2的引用,此时,这两个对象指向的是同一内存地址,所以比较值的结果是str2==str3。
读者可能会问,那该如何去比较里面的内容呢?这就需要采用另外一种方式——“equals”,请看下面的程序,下面的程序TestEquals1.java修改自程序TestEquals.java,如下所示:
范例:TestEquals1.java
01 public class TestEquals1
02 {
03 public static void main(String[] args)
04 {
05 String str1 = new String("java") ;
06 String str2 = new String("java") ;
07 String str3 = str2 ;
08 if(str1.equals(str2))
09 {
10 System.out.println("str1 equals str2");
11 }
12 else
13 {
14 System.out.println("str1 not equals str2") ;
15 }
16 if(str2.equals(str3))
17 {
18 System.out.println("str2 equals str3");
19 }
20 else
21 {
22 System.out.println("str2 note equals str3") ;
23 }
24 }
25 }
输出结果:
str1 equals str2
str2 equals str3
这个时候可以发现,在程序中将比较的方式换成了equals,而且调用equals()方法的是String类的对象,所以可以知道equals是String类中的方法。在这里读者一定要记住:“==”是比较内存地址值的,“equals”是比较内容的。
!小提示:
有些读者可能会问,下面两种String对象的声明方式到底有什么不同?
String str1 = new String("java");
String str2 = "java";
下面先来看一个范例:
01 public class StringDemo
02 {
03 public static void main(String[] args)
04 {
05 String str1 = "java" ;
06 String str2 = new String("java") ;
07 String str3 = "java" ;
08 System.out.println("str1 == str2 ? --- > "+(str1==str2)) ;
09 System.out.println("str1 == str3 ? --- > "+(str1==str3)) ;
10 System.out.println("str3 == str2 ? --- > "+(str3==str2)) ;
11 }
12 }
输出结果:
str1 == str2 ? --- > false
str1 == str3 ? --- > true
str3 == str2 ? --- > false
由程序输出结果可以发现,str1与str3相等,这是为什么呢?还记得上面刚提到过“==”是用来比较内存地址值的。现在str1与str3相等,则证明str1与str3是指向同一个内存空间的。“java”这个字符串在内存中开辟的一个空间,而str1与str3又同时指向同一内存空间,所以即使str1与str3虽然是分两次声明的,但最终却都指向了同一内存空间。而str2是用new关键字来开辟的空间,所以单独占有自己的一个内存空间。
另外,还要提醒读者注意的是,String对象的内容一旦声明则不能轻易改变。如果想改变一个String对象的值,则第一步要做的是先将原有的String引用断开,之后再开辟新的内存空间,而且如果用new关键字开辟String对象的内存空间的话,则实际上就开辟了两个内存空间,所以一般在开发上都采用直接赋值的方式。