锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

8 Equality in ADT and OOP ADT和OOP中的“等价性”

时间:2023-04-10 02:37:01 lqm18dh片式电感器

8 Equality in ADT and OOP ADT和OOP等价性中的等价性

Outline

在许多情况下,我们需要判断这两个对象是否相等,在这个时候经常使用==”和“.equals然后,我们将探讨如何判断两个对象之间的平等关系。

1 Equivalence Relation

现实世界中的每个对象都是独一无二的,不能完全相等,但绝对相等存在于人类语言和数学中。引用集合论中等价关系的定义:

An equivalence is a relation E ? T x T that is:

– reflexive: E(t,t) ?t∈T

– symmetric: E(t,u) ? E(u,t)

– transitive: E(t,u) ∧ E(u,v) ? E(t,v)

– To use E as a definition for equality, we would say that a equals b if and only if E(a,b).

等价关系:自反、对称、传递

2 Three ways to regard equality

2.1AF(Abstract Function)

ADT是数据的抽象,体现为一组对数据的操;那么AF它充当了内部表示抽象表示的桥梁,相当于一种映射。从外部观察者的角度来看,如果对象调用任何操作,都会得到两个相同的结果,可以认为这两个对象是平等的。

在这里,我们需要学会判断哪些方法的选择与观察定义相同AF一致的。

有时一种单独的方法无法准确判断,需要多种方法的组合。

2.2“==引用等价性

利用“==测试引用的等价性,只有两个对象在内存中的地址相同,才会被认定为相等。换句话说,此时查看snapshot(快照图),两个相等引用的指针指向同一对象。

基本数据类型一般采用==判等。

2.3“.equals( )对象等价性

自定义ADT根据等价的要求,决定是否重写Object中的equals()方法。

一般来说,用于对象.equals()判断方法。是否重写.equals()方法取决于其内在判断逻辑。如果判断的逻辑等于内存地址,则无需重写;如果判断的逻辑是特定的,则需要根据此特定的逻辑重写。无论在什么情况下使用对象,equals()方法将达到目标的预期。

3 Implementing equals()

在缺省的情况下,默认判断引用等价性,不过这通常不是程序员所希望看到的:

在这里插入图片描述

注意我们要做的是override而不是overload,因此引用的是父类object而不是子类

例如,以下情况是错误的:

那么这样做会发生什么呢?

Duration类重载了equals() 方法,因为方法签名和Object的不同。我们实际上在Duration中有两个equals() 方法:

– 从 Object 继承的隐式 equals(Object)

– 新的 equals(Duration)。

Java 在重载操作之间选择编译器使用参数的编译类型。(静态检查)

假如我们传递一个Object 引用,就像d1.equals(o2) 我们最终会调用会调用它equals(Object) 实现。假如我们传递一个Duration 引用,如在d1.equals(d2) 我们最终会调用它 equals(Duration) 版本。即使 o2 和 d2 在运行时都指向同一个对象,也会发生这种情况! 这将使相等难以判断,并在编译阶段设置了不同的调用方法。

初学者很容易犯这样的错误,错误地使用标签,所以当覆盖超级方法时,应该使用Java的注释@Override,这样Java编译器将检查超类中是否有相同的签名方法。如果在签名中出现错误,编译器将返回错误。

重写有几个技巧,比如使用instanceof()不时判断对象的特定类型或子类型,注意动态类型检查。

4The Object contract

对象的Equals方法有几个约定:

  1. 必须满足等价关系:自反、对称、传递。

  2. 多次调用的结果是一致的,除非对象被修改。

  3. 相等对象hashcode必须等同。

    哈希表是映射表示:一种抽象数据类型,将键映射到值。

    – 哈希表提供恒定时间查找,因此它们往往比树或列表执行得更好。除了提供 equals 和 hashCode此外,键不必有序,也不必有任何特定的属性。

    如何工作哈希表:

    – 它包含一个与我们预期插入的元素数量相对应的数组。

    – 当插入一个键和一个值时,我们计算键的哈希码,并将其转换为数组范围内的索引例如,通过模除法)。 然后将值插入索引。

    由哈希码确定的槽中不变量的基本约束。 Hashtable的RI基本要求是key在slot中的位置由hashcode确定。

在程序中调用相同的对象必须返回相同的对象hashcode,不同的对象也可以映射相同hashcode,但是性能会变差。通过计算更合理的方法是equals使用油的信息hashcode组合出新的hashcode。当然,你也可以考虑不需要hashcode,但是你必须保证你的ADT永远不要被放进去Hash集合类型。

5Equality of Mutable Types

对于可变类型的对象,要注意等价性和行为等价性。Java观察大多数可变数据类型的等价性和部分使用行为的等价性。有时观察等价性可能会导致bug,甚至可能损坏RI。

如果某个mutable对象包含在内Set在集合类中,当它发生变化时,集合类的行为是不确定的JDK中,不同的mutable类别使用不同的等价标准。

对于可变类型,只有志向相同内存空间的人才能实现行为等价性object是平等的。对于可变类型,直接继承不需要重写两个函数object如果你必须判断两个可变对象是否一致,最好定义一种新方法。

另外可以用IDEA上述代码自动生成。
bject是平等的。对于可变类型,直接继承不需要重写两个函数object如果你必须判断两个可变对象是否一致,最好定义一种新方法。

另外可以用IDEA上述代码自动生成。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章