在Java中,我们比较两个对象时有两种方法,一种是直接使用逻辑运算符==号,还有一种就是用equlas()函数,该函数在Object中就定义了,所以每个类都会有这个函数,好了现在我们看看普通对象和字符串在使用这两种比较方式有什么不同,看下面代码,读者可以猜猜看结果是什么:

public class Equals {
 /**
  * @param args
  */
 public static void main(String[] args) {
  Object o1 = new Object();
  Object o2 = new Object();
  Object o3 = o1;
  Object o4 = o2;
  System.out.println( "o1.equals( o1 ): " + o1.equals( o1 ) );
  System.out.println( "o1.equals( o2 ): " + o1.equals( o2 ) );
  System.out.println( "o1.equals( o3 ): " + o1.equals( o3 ) );
  System.out.println( "o1.equals( o4 )" + o1.equals( o4 ) );
  
  System.out.println();
  System.out.println( "o1 == o1: " + ( o1 == o1 ) );
  System.out.println( "o1 == o2: " + ( o1 == o2 ) );
  System.out.println( "o1 == o3: " + ( o1 == o3 ) );
  System.out.println( "o1 == o4: " + ( o1 == o4 ) );
  System.out.println();
  String s1 = new String( "abc" );
  String s2 = new String( "abc" );
  String s3 = new String( "def" );
  String s4 = s1;
  String s5 = s2;
  String s6 = s3;
  System.out.println( "s1.equals( s1 ): " + s1.equals( s1 ) );
  System.out.println( "s1.equals( s2 ): " + s1.equals( s2 ) );
  System.out.println( "s1.equals( s3 ): " + s1.equals( s3 ) );
  System.out.println( "s1.equals( s4 ): " + s1.equals( s4 ) );
  System.out.println( "s1.equals( s5 ): " + s1.equals( s5 ) );
  System.out.println( "s1.equals( s6 ): " + s1.equals( s6 ) );
  System.out.println();
  System.out.println( "s1 == s1: " + ( s1 == s1 ) );
  System.out.println( "s1 == s2: " + ( s1 == s2 ) );
  System.out.println( "s1 == s3: " + ( s1 == s3 ) );
  System.out.println( "s1 == s4: " + ( s1 == s4 ) );
  System.out.println( "s1 == s5: " + ( s1 == s5 ) );
  System.out.println( "s1 == s6: " + ( s1 == s6 ) );
 }
}
 
有没有答案了,如果有了,看看你的答案正确吗,
o1.equals( o1 ): true
o1.equals( o2 ): false
o1.equals( o3 ): true
o1.equals( o4 )false
o1 == o1: true
o1 == o2: false
o1 == o3: true
o1 == o4: false
s1.equals( s1 ): true
s1.equals( s2 ): true
s1.equals( s3 ): false
s1.equals( s4 ): true
s1.equals( s5 ): true
s1.equals( s6 ): false
s1 == s1: true
s1 == s2: false
s1 == s3: false
s1 == s4: true
s1 == s5: false
s1 == s6: false
 
为什么会出现上面的结果呢,其实在Java中,逻辑运算符==号在比较对象的时候是严格的比较这两个对象是不是同一个对象,说白了,它比较的是两个对象在内存中的地址,只有当两个变量指向同一个内存地址即同一个对象时才返回true,否则返回false,所以就可以看到当我们用new方法创建了o1和o2由于分配了两个不同的内存空间,所以它们在用逻辑运算符==号来判断两个对象是否相等时自然应该返回的是false,而在比较o1和o3时,由于o3指向的实际是o1所指向的地址,所以返回true,在字符串中逻辑运算符==的作用和普通对象是一样的。
 
那么对于o1和o2用equals()方法比较返回的为什么也是false呢,我们来看一段代码:
public boolean equals( Object o2 )
{
   this == o2;
}
这是Object中equals()函数的实现,可以看到实际上它的功能还是比较两个对象的地址,自然你现在可以推出为什么o1和o2比较时还是返回false了。
 
那现在问题可能来了,那为什么s1和s2比较时返回的是true呢,他们在内存空间的地址可是不一样的啊,呵呵,其实这个理解起来更简单了,因为在String类中重载了equals()函数,使它比较的是两个字符串的内容,而不是两个字符串对象在内存中的地址,至于如何写这个函数我就不多说了,大家可以自己写写看,实现方式有多种,不过Sun公司当然只有那一种实现方式,哈哈