`
xichao1929
  • 浏览: 40202 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

 有Java基础的人都会搞懂一个问题就是equals==的区别是什么.我的文章便从这开始谈起。首先我要告诉你equals==是完全一样的。你可能非常不赞同。请看下面的代码  

 public boolean equals(Object obj) {
	return (this == obj);
    }

 

显然这段代码印证了我刚才的话。那么这段代码从何而来呢,它是object类的一个方法,也就是equals的原形。至于我们所用到的equals==不一样。很简单equals被重写了。我们用到的equals方法不是Object的,而是他的子类的。当然有一个很重要的问题被我忽视了,也就是==比较的是jvm的堆中对象的位置,简单的说就是对象的地址,而不是对象的内容。

重写equals方法的类不止一个我们看看下面的这几个。

<!--EndFragment-->

 

下面看一下和==有点关系的两个代码:

      Integer i1 = 200;
  Integer i2 = 200;
  System.out.println("i1==i2: "+(i1==i2));
和
    Integer i3 = 100;
  Integer i4 = 100;
  System.out.println("i3==i4: "+(i3==i4));
  

这两代码很简单,说一句废话,如果你懂,就会感觉答案很简单,不懂,就傻眼了,哈哈。

<!--EndFragment--> 这两段代码的结果是:

 

      i1==i2: false
  i3==i4: true

 "==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
  在自动装箱时对于值从-128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,
  所以范例中,i3 与 i4实际上参考至同一个对象。
  如果超过了从-128到127之间的值,被装箱后的Integer对象并不会被重用,
  即相当于每次装箱时都新建一个 Integer对象,所以范例中,i1与i2参考的是不同的对象。
  另外,当不使用自动装箱功能的时候,情况与普通类对象一样,请看下例:

 

       Integer i3 = new Integer(100);
   Integer i4 = new Integer(100);
   System.out.println("i3==i4: "+(i3==i4));//显示false

 

<!--EndFragment--><!--EndFragment-->
 public boolean equals(Object obj) {
	if (obj instanceof Integer) {
	    return value == ((Integer)obj).intValue();
	}
	return false;
    }

 

这个方法是Integer中的方法,显然这个比较的是对象的内容,即某一Integer对象的值。而不是对象地址了。自然这个时候equals==就不一样了。

 public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

 

这个是String中的equals方法。因此可以这样解释一下,所要判断的String对象,如果是同

一个对象,则返回true,如果不一样,但是内容一样,也会返回true

关于equals方法的重写有几条规则:

  1)自反性:对于任何非空的引用x'x.equals(x) 应该返回true

  (这也是String中重写equals时,第一个判断的原因)

  2) 对称性:对于任何引用xy,如果x.equals(y)返回true,反过来亦成立。

  3) 传递性:对于任何引用xyz,如果x.equals(y)返回

truey.equals(z)返回true,那么x.equals(z)也应该返回true

  4) 一致性:如果xy引用的对象没有发生变化,那么反复调用

x.equals(y)应该返回同样的结果。

  5) 对于任意非空引用xx.equals(null)应该返回false

下面是对重写equals方法的一些建议:

下面给出编写一个完美的equals方法的建议:

1) 显式参数命名为otherObject,稍后需要将它转换成另一个叫

做 other的变量。

2) 检测thisotherObject是否引用同一个对象:

        if (this == otherObject) return true;

        这条语句只是一个优化。实际上,这是一种经常采用的形

        式。因为计算这个等式要比一个一个地比较类中的域所付

        出的代价小得多。

3) 检测otherObject是否为null,如果为null,返回false。这项

       检测是很必要的。

                if (otherObject == null) return false;

       比较thisotherObject是否属于同一个类。如果equals的语

       义在每个子类中有所改变,就使用getClass检测:

               if (getClass() != otherObject.getClass()) return false;

       如果所有的子类都拥有统一的语义,就使用instanceof检测:

              if (! (otherObject instanceof ClassName)) retrun false;

4)将otherObject转换为相应的类类型变量:

        ClassName other = (ClassName)otherObject;

5) 现在开始对所有需要比较的域进行比较了。使用 == 比较

       基本类型域,使用equals比较对象域。如果所有的域都匹

       配,就返回ture;否则返回false

               return field1 == other.field1

                         && field2.equals(other.field2)

                         && ……;

<!--EndFragment-->

<!--EndFragment-->
1
1
分享到:
评论
4 楼 zhangcan6176 2012-12-12  
LZ牛X
3 楼 dingran 2012-12-12  
我看过Effective Java的关于equal的内容,他里面也提到了这些规则,看来如果要提供这个功能,还是挺复杂的,这是考验一个程序员的时刻啊,呵呵
2 楼 dingran 2012-12-12  
工作几年后,更应该回到这些基本知识上来重新思考,这样的收获能记住一辈子,不会遗忘的知识链。赞许楼主的研究态度!
1 楼 xiaokang1582830 2012-12-12  
这些才是最基础的东西!基础不扎实是无法写出优雅高效的代码

相关推荐

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    java中equals和==的区别.doc

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...

    java中equals和==的区别.docx

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个常用的操作符,经常用于比较对象或变量的值。然而,许多开发者不知道它们之间的区别,或者误用它们,导致程序出错。下面我们将详细解释 equals 和 == 的...

    Java基础复习(内附String中equals与==区别的分析)

    本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...

    Java 中equals和==的区别.doc

    Java 中equals和==的区别

    【Java面试题】equals与==的区别

    【Java面试题】equals与==的区别

    equals与==之间的区别

    在Java编程语言中,`equals`方法与`==`操作符是进行对象比较时最常用的两种方式,但它们之间存在着显著的区别。理解这些差异对于正确地处理对象比较至关重要。 ### `==` 操作符 `==`操作符主要用于比较两个基本...

    java中equals和==的区别-5页.pdf

    java中equals和==的区别-5页.pdf

    java 资料 equals 与== 的区别

    Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...

    java中equals和==的区别.

    理解`equals()`和`==`的区别对于避免常见的错误至关重要,比如在比较自定义对象时误用`==`而导致预期结果出错。当比较自定义对象时,通常应该重写`equals()`方法,以便比较对象的属性或状态,而不是仅仅比较引用。...

    java中equals()函数的用法 equals和==的区别

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...

    java中equals和==的区别.pdf

    Java中equals和==的区别 Java是一门面向对象的编程语言,它提供了多种运算符和方法来比较对象和变量。在Java中,比较两个对象是否相等时,经常使用到的运算符有"=="和"equals"。虽然两者都可以用于比较,但它们有着...

    java equals和==的区别详解

    在Java编程语言中,`equals()` 和 `==` 运算符在比较对象时有着显著的不同。理解这两者的区别对于编写高效、可靠的代码至关重要。以下是它们的详细解释: 1. **`==` 运算符**: `==` 在Java中主要用于比较基本类型...

Global site tag (gtag.js) - Google Analytics