Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1967398
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-07-19 22:55:24

Java API中的一些类覆盖了Object类的equals(Object o)方法,实现了安对象值比较。

这些类包括:String类和Date类;Java包装类,包括:Byte、Integer、Short、Character、Lomg、Double和Boolean。

除上面之外,“==”和equals(Object o)都时按内存地址比较的。

equsls(Object o)可以自定义覆盖,实现按值比较

eqauls 与 = =之异同
  1)比较方式角度:

  = =是面向过程的操作符;equals是面向对象的操作符

  = =不属于任何类,equals则是任何类(在中)的一个方法;

  我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);

  2)Object Reference1(对象引用)= = Object Reference2(对象引用)

  3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

  这三种比较

  但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

  对于基本类型,没有面向对象中发送消息一说,自然也不会有

  方法成员。

  2)比较目的角度:

  1) 如果要比较两个基本类型是否相等,请用= =;

  2) 如果要比较两个对象引用是否相等,请用= =;

  3) 如果要比较两个对象(逻辑上)是否一致,请用equals;

  在比较对象时候,常常用到 "==" 和 "equals(Object)"。它们常常让初学者感到疑惑。下面先看一个例子
  public class Example1
  {
   public static void main(String[] args)
   {
   String s1=new String("abc");
   String s2=new String("abc");
   // s1=s2;
   System.out.println("用 == 比较结果");
   System.out.println(s1==s2); //false
   }
  }
  既然两个 String 对象内容同为 "abc" 为什么先打出 false 呢。那是由于 "==" 比较的是两个对象的引用 (references),并不是他们的内容,怎么才能比较内容是否相等呢?去掉 s1=s2 一句的注释符结果就不同了,因为他们的引用相同了。
  我们要使用 equals(Object) 方法,由于 equals(Object) 方法为 Object 类中定义的方法,所用按照默认方式定义过的类均是其子类。 也就是说 Object 类为所有类的超类 (super class,也叫父类、基类等),在Object 中的 equals(Object) 方法其标准形式为
  public boolean equals(Object obj)
  返回类型为 boolean ,即 true/false 与 "==" 返回类型一样。Object 类中定义的 equals(Object) 方法是直接使用 "==" 比较的两个对象,所以在没有覆盖 (override,或称改写、重写) equals(Object) 方法的情况下,equals(Object) 与 "==" 一样是比较的引用。如下例 (结果在注释中):
  public class Example4
  {
   public static void main(String[] args)
   {
   Example4 e=new Example4();
   Example4 e4=new Example4();
   System.out.println("用 equals(Object) 比较结果");
   System.out.println(e.equals(e4)); //结果为 false
   System.out.println("用 == 比较结果");
   System.out.println(e==e4); //结果为 false
   }
  }
  equals(Object) 方法与 "==" 相比的特殊之处就在于它可以覆盖,所以我们可以通过覆盖的办法让它不是比较引用而是比较数据内容。当然 JDK 中也有覆盖过 equals(Object) 方法的类,如 java.lang.String,它就覆盖了从 Object 继承来的的 equals(Object) 方法,用以比较字符串内容是否相同。看看下面这个例子:
  public class Example1
  {
   public static void main(String[] args)
   {
   String s1=new String("abc");
   String s2=new String("abc");
   System.out.println("用 == 比较结果");
   System.out.println(s1==s2);//false
   System.out.println("用equals(Object) 比较结果");
   System.out.println(s1.equals(s2));//true
   }
  }
  例中用 equals(Object) 比较结果为 true。用 == 比较结果为 false。String.equals(Object) 方法直接比较了两个字符串的内容,如果相同则返回 true ,否则返回 false。

equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。


正在装载数据……


==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true这是从Think in java 中找的

1. 检查对象是否相等
关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子:


//: Equivalence.java

public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
} ///:~

其中,表达式System.out.println(n1 == n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容相同,句柄却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这自然会使第一次接触的人感到惊奇。
若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。下面举例说明如何使用:


//: EqualsMethod.java

public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
}
} ///:~

正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样:


//: EqualsMethod2.java

class Value {
int i;
}

public class EqualsMethod2 {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
} ///:~

此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为。不幸的是,要到第7章才会学习如何改变行为。但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。

阅读(250) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~