`
小小黑咖啡
  • 浏览: 11325 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

第八条 覆盖equals是要遵守通用的约定

阅读更多
第八条 覆盖equals是要遵守通用的约定
覆盖equals必须满足以下四个要求:
(1)自反性
对于任何非null的引用值x,x.equals(x)返回true
(2)对称性
对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,

x.equals(y)必须返回true
(3)传递性
对于任何非null的引用值x、y和z,如果x.equals(y)返回true,

y.equals(z)返回true,则x.equals(z)返回true
(4)一致性
对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的

信息没有被修改,多次调用x.equals(y)就会一致的返回ture或者false

(1)自反性是最为基本的性质,所以最好完成。
(2)对称性

public class MyString {

	private final String s;
	
	public MyString(String s) {
		this.s = s;
	}
	
	@Override
	public boolean equals(Object o) {
		if(o instanceof MyString) {
			MyString cis = (MyString)o;
			return s.equalsIgnoreCase(cis.s);
		}
		if(o instanceof String) {
			return s.equalsIgnoreCase((String)o);
		}
		return false;	
	}
}


import junit.framework.Assert;

import org.junit.Test;

public class TestMyString {

	@Test
	public void testEquals() {
		MyString ms = new MyString("P");
		String s = "p";
		Assert.assertEquals(ms.equals(s), true);
		Assert.assertEquals(s.equals(ms), false);
	}
	
}

说明自反性是被违背了,所以可以将代码改为:
public class MyString {

	private final String s;
	
	public MyString(String s) {
		this.s = s;
	}
	
	@Override
	public boolean equals(Object o) {
		if(o instanceof MyString) {
			MyString cis = (MyString)o;
			return s.equalsIgnoreCase(cis.s);
		}
		return false;	
	}
}

自己就和自己比较,不要贪多。
(3)传递性

public class MyPoint {

	private final int x;
	private final int y;
	
	public MyPoint(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	@Override
	public boolean equals(Object o) {
		if(!(o instanceof MyPoint))
			return false;
		MyPoint p = (MyPoint)o;
		return p.x == x && p.y == y;
	}
}


import java.awt.Color;


public class MyColorPoint extends MyPoint{

	private Color c;
	
	public MyColorPoint(int x, int y, Color c) {
		super(x, y);
		this.c = c;
	}
	@Override
	public boolean equals(Object o) {
		if(!(o instanceof MyColorPoint))
			return o.equals(this);
		if(!(o instanceof MyPoint))
			return false;
		return super.equals(o) && ((MyColorPoint)o).c 

== c;
	}
}


import java.awt.Color;

import org.junit.Assert;
import org.junit.Test;



public class TestMyColorPoint {

	@Test
	public void testEquals() {
		MyPoint p = new MyPoint(1,2);
		MyColorPoint mcp1 = new MyColorPoint

(1,2,Color.BLUE);
		MyColorPoint mcp2 = new MyColorPoint

(1,2,Color.RED);
		Assert.assertEquals(mcp1.equals(p), true);
		Assert.assertEquals(p.equals(mcp2), true);
	}
}

现在满足了对称性,又丧失了传递性,所以还要修改equals方法。

总之,equals和人的思维应该是一样的,所以全面的思考可能出现的各种情况,并且根据情况写出解决方法是写好equals的关键

分享到:
评论

相关推荐

    winform 重写Equals源码

    5. **相等性约定**:为了保持一致性,通常还需要重写`GetHashCode`方法,以便当两个对象相等时,它们的哈希码也相等。此外,`Equals`和`GetHashCode`应满足以下契约: - 如果`a.Equals(b)`为`true`,那么`a....

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。

    equals(Object) 与 == 的区别

    "equals(Object) 与 == 的区别" .equals(Object) 与 == 的区别是 Java 编程语言中一个常见的问题,许多初学者都感到困惑。下面我们将详细地解释这两个概念之间的区别。 首先,让我们看一个例子。假设我们有两个 ...

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    重写equals方法

    第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...

    java中equals和==的区别

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

    java_equals用法

    java_equals用法,用来熟悉重写equals方法的

    Java 覆盖equals时总要覆盖hashcode

    在Java编程中,当我们重写`equals()`方法时,通常也需要重写`hashCode()`方法。这是因为`equals()`和`hashCode()`方法在Java集合框架中扮演着重要的角色,特别是在使用`HashMap`、`HashSet`等基于哈希表的集合类时。...

    equals问题经典

    在Java编程语言中,`equals()`方法是用来比较两个对象的内容是否相等的,而`==`操作符则是用来比较两个变量是否引用同一个对象。这里我们将深入探讨`equals()`方法的用法,以及它与`==`的区别,同时解决题目中提出的...

    重写toString和equals方法

    Java 对象的toString和equals方法重写 在 Java 中,每个对象都继承自 Object 类,而 Object 类中定义了两个重要的方法:toString() 和 equals()。这两个方法都是非常重要的,它们分别用于对象的字符串表示和对象...

    重载equals方法示例

    重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例

    java 资料 equals 与== 的区别

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

    Java语言深入_equals

    因此,我们在重写`equals`时,不仅要确保所有相关字段都被正确比较,还要考虑父类中可能存在的其他属性。 在实践中,为了编写正确的`equals`方法,通常建议使用`Objects.equals()`和`Objects.hash()`方法,它们可以...

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

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

    ==和equals的区别

    Java 中的 == 和 equals 方法的区别 在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    equals方法的重写.docx

    ### equals方法重写知识点解析 #### 一、equals方法简介 `equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容...

    知识点 比较运算符==和equals方法的比较

    在Java编程语言中,比较运算符`==`和`equals()`方法是用来检查两个对象是否相等的,但它们之间存在显著的区别。理解这些差异对于编写正确的代码至关重要。 首先,我们来看`==`运算符。它主要用于基本数据类型的比较...

    set接口经常用的hashCode和equals方法详解

    为了实现元素的唯一性,`Set`接口要求覆盖`equals`方法,使其能够根据元素的实际内容来进行比较。 - **内容比较**: 在`Set`接口的不同实现中,通常会根据元素的属性或内容来进行比较。例如,在`String`类中,`...

    ==和equals方法究竟有什么区别

    同时,为了保持一致性,如果重写了`equals()`,通常也需要重写`hashCode()`方法,以满足`equals()`和`hashCode()`的合同约定,即如果两个对象相等(`equals()`返回`true`),它们的`hashCode()`应该也相等。...

Global site tag (gtag.js) - Google Analytics