Java程序构造©Day6

Java程序构造©Day6

April 2nd, 2018
标签(空格分隔): Java程序构造



Equality in ADT and OOP 复写equals()hashCode()

  • 站在观察者角度 利用AF 定义对象之间的等价关系
  • 引用等价性 对象等价性
  • 可变数据类型的观察等价性和行为等价性
  • 正确实现等价判断

什么是等价性

对于等价性在这里主要是指对象之间的等价性 包括ADT

要基于抽象函数AF来找到等价操作

等价性判断依据

  • 可以使用AF 如果AF映射出的结果相同 那么两者等价 即两者具有自反 对称 可传递的性质
  • 可以基于观察者的角度给出判断

这里给出一个例子

屏幕快照 2018-04-02 上午8.30.42.png-101.6kB

判断以下对象的等价性

屏幕快照 2018-04-02 上午8.31.39.png-48.8kB

对于任何的两个对象 AF映射出的结果如果相等 那么两者等价

显然 d1 d3 d4等价

== 和 equals()

在java中 == 和 equals是一样的

 referentialobject
Java==equals()
Obj C==isEqual:
C#==Equals()
Pythonis==
Javascrip==n/a

Javaequals()的判断适用于对象 如果使用==那么判断两者的身份ID是否相同

不可变类型的等价性

重写equals()

屏幕快照 2018-04-02 上午8.43.02.png-32.7kB

Java的等价性判断定义在Object中 但是实现很简陋 多数情况下不适用与自定义类型 所以需要@Override

我们定义一个类型

public class Duration{
    ...
    // Problematic definition of equals
    public boolean equals(Duration that){
        return this.getLength() == that.getLength();
    }
}

注意这不是重写 而是重载

那么对于下面的类型判断

Duration d1 = new Duration(1,2);
Duration d2 = new Duration(1,2);
Object o2 = d2;
d1.equals(d2);//True
d1.equals(o2);//False

虽然d2 o2指向的对象可能非常相像 但是 我们在上边的定义中重载了equals 那么这个类型中应该有两个判断

public boolean equals(Duration that){
    ...
}

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

根据传入的类型 传入的o2是一个Object类型的对象 那么Java会自动调用后者进行判断 当然不相等

所以我们采用以下的方式进行重写

@Override
public boolean equals(Object that){
    if(!(that instanceof Duration)) return false;
    Duration thatDuration = (Duration) that;
    return thatDuration.getLength(); == this.getLength();
}

我们推荐的重写方法

public final class PhoneNumber {
    private final short areaCode;
    private final short prefix;
    private final short lineNumber;
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof PhoneNumber)) // Does null check
            return false;
        PhoneNumber pn = (PhoneNumber) o;
        return pn.lineNumber == lineNumber
        && pn.prefix == prefix
        && pn.areaCode == areaCode;
    }
    ...
}

注意 instacnceof()最好只在类型判断相等时使用 更不要使用getClass()

重写hashCode()

刚刚讲到的等价性判断 涉及到自反 传递 对称

  • 自反 对任何非null类 x.equals(x)必为真
  • 对称 对任何非null类 x.equals(y)为真当且仅当y.equals(x)
  • 传递 对任何非null类 如果x.equals(y)为真且y.equals(z)为真 那么x.equals(z)必为真
  • 对任何非null类 x.equals(null)必为假

在不保证这几类的情况下 equals()存在问题

如果两个object调用了equals() 那么在调用后会调用各自的hashCode()来产生一个数 两者必须相等

所以我们有几个原则

  • 相等的对象 重写equals()必须重写hashCode()
  • 不相等的对象 必须有不相等的hashCode
  • hashCode不变 除非对象发生变化

在java中的equals和hashCode的原写法

public class Object{
    public boolean equals(Object that){
        return this == that;
    }
    public int hashCode(){
        return /* return the memory address of this object */
    }
    ...
}

所以 对于之前给出的Duration的例子是不正确的 破坏了hashCode的原则

我们要保证对于等价的对象 hashCode必须相等

我们有hashCode重写的推荐写法

public final class PhoneNumber {
    private final short areaCode;
    private final short prefix;
    private final short lineNumber;
    @Override
    public int hashCode() {
        int result = 17; // Nonzero is good
        result = 31 * result + areaCode; // Constant must be odd result     = 31 * result + prefix; // " " " "
        result = 31 * result + lineNumber; // " " " "
        return result;
    }
    ... 
}

另一种写法 虽然低效 但是很好用

@Override
public boolean hashCode(){
    return Arrays.hashCode(areaCode, prefix, lineNumber);
}

可变类型等价性

对于等价类型 我们从两点出发 行为等价性 和 观察等价性

行为等价性是对其中AF映射的结果相等 那么判断相等

观察等价性是在不改变状态的情况下 其中的任何类型 都相等

一般对于可变类型 我们倾向于严格的观察等价性 但是可能出现漏洞

List<String> list = new ArrayList<>();
list.add("a");
Set<List<String>> set = new HashSet<>();
set.add(list);

set.contains(list);//true
list.add("b");
set.contains(list);//false

这涉及到equals和hashCode的

对于容器类型 我们偏向于使用观察等价性

对于其他类型 我们倾向于行为等价性

  • 对可变类型 实现行为等价性即可
  • 只有指向相等的地址 才能相等
  • 可变类型无需重写两个方法 直接继承
  • 如果一定要判断 新写一个方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值