首页 > 其他分享 >ADT和OOP中的“等价性”知识点总结

ADT和OOP中的“等价性”知识点总结

时间:2023-05-19 19:55:35浏览次数:39  
标签:知识点 ADT 对象 equals 等价 hashCode OOP 可变 类型

知识点概要:

  • 等价关系
  • 不可变类型的等价性
  • == 与 equals()
  • 实现equals()
  • 对象合同
  • 可变类型的等价性
  • 自动装箱和等价

一、等价关系

  ADT的等价关系是基于AF来定义的

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

二、不可变类型的等价性

  不可变类型的等价性还是依据与AF,AF映射到同样的结果,则等价。这也就是说,站在外部观察者的角度:对两个对象调用任何相同的操作,都得到相同的结果,这样就会认为这两个对象等价。反之亦然。

三、==与equals()

  ==:引用等价性,即如果A==B,则A和B指向内存中同一处地址

  对于基本数据类型,要采用==判定相等。

  equals():对象等价性,即equals会比较对象内容

  由于对于不同的类比较是否等价的条件也不一样,因此,在自定义ADT时,需要重写equals()才能正确的进行equals判断。

  对于对象类型,使用equals()判定相等,如果使用==,是在判断来年各个对象是否指向内存中的同意地址。

四、实现equals()

  这是Object类中默认的equals()函数,在这的equals()是在判断引用等价性,这通常不是程序员所希望的,因此需要重写,以满足对象等价性。

五、对象合同

  除非对象被修改了,否则多次调用equals应得到同样的结果

  “相等”的对象,其hashCode()的结果必须一致

  程序中多次调用同一个对象的hashCode方法,都要返回相同的值

  若两个对象相等,则它们的hashCode相等;反之,若两个对象不相等,则它们的hashCode不相等

  当重写Object中的equals()时,也要重写hashCode()。

六、可变类型的等价性

  在可变类型中,有两种等价性:

  观察等价性:在不改变状态的情况下,两个可变对象是否看起来一致

  行为等价性:调用对象的任何方法都展示出一致的结果

注意:对于不可变对象,观察等价性和行为等价性是相同的,因为没有mutator方法。

  对于可变类型,往往倾向于实现严格的观察等价性。但这也可能导致bug,甚至破坏RI。主要是由于在可变类型的对象包含在HashSet集合中,变量改变后,hashCode也会改变,导致等价性判断失败。

  因此,对于可变类型,实现行为等价性即可,也就是说指向同样内存空间的objects才相等,所以对于可变类型没无需重写equals()和hashCode()方法,直接继承Object中的即可。

  如果一定要判断两个可变类型变量的观察等价性,最好定义一个新的方法。

七、自动装箱和等价

  Java中为每种基本数据类型都提供了对应的包装器类型,让基本类型具备对象的特征,实现更多的功能。

   装箱就是将基本数据类型转换为包装器类型。

  在判断等价中,由于包装器类型是不可变类型,而基本数据类型是可变类型,在装箱与拆箱的过程中就会在判断相等的过程中产生差异。

  就比如:

  

  而x==y 的结果又是False,而再将x和y都转换为int类型,结果又是true。这是基本类型和封装器类型的差异。

  自动装箱的过程又如下所示:  

  

 

 

  

标签:知识点,ADT,对象,equals,等价,hashCode,OOP,可变,类型
From: https://www.cnblogs.com/JayLv/p/17416133.html

相关文章

  • vue组件通信6种方式总结(常问知识点)
    前言在Vue组件库开发过程中,Vue组件之间的通信一直是一个重要的话题,虽然官方推出的Vuex状态管理方案可以很好的解决组件之间的通信问题,但是在组件库内部使用Vuex往往会比较重,本文将系统的罗列出几种不使用Vuex,比较实用的组件间的通信方式,供大家参考。组件之间通信的场景在......
  • 面向对象的编程(OOP)知识点总结
    软件构造期末考试将近,在此我将从OOP这一章节开始复习,记录下该章节中的重点内容。知识点概要:OOP基本概念:对象、类、属性、方法、接口和枚举OOP的独特特征:——封装与信息隐藏——继承与重写——多态、子类型、重载——静态与动态分派Java中一......
  • Nacos必知必会:这些知识点你一定要掌握!
    前言Nacos是一个开源的服务发现、配置管理和服务治理平台,是阿里巴巴开源的一款产品。Nacos可以帮助开发者更好地管理微服务架构中的服务注册、配置和发现等问题,提高系统的可靠性和可维护性。本文将介绍Nacos的必知必会知识点,包括服务注册与发现、配置管理、命名空间等内容......
  • 一、Hadoop平台安装
    卸载自带OpenJDK(最小化安装不用执行)[root@master~]#rpm-qa|grepjava[root@master~]#rpm-e--nodepsxxx配置免密登录生成密钥对:[root@master~]#ssh-keygen-trsa(回车四次)发送公钥:[root@master~]#ssh-copy-id192.168.100.10ssh-copy-id192.168.100.20ss......
  • 五、Sqoop平台安装
    实验任务一:下载和解压Sqoop解压sqoop:tar-zxvfsqoop-1.4.7.bin__had.gz重命名:mvsqoop-1.4.7.bin__hadoop-2.6.0/sqoop实验任务二:配置Sqoop环境切换目录:cd/usr/local/src/sqoop/conf复制sqoop-env-template.sh模板:cpsqoop-env-template.shsqoop-env.sh编辑文......
  • Hadoop的核心配置文件
    1.core-site.xml:该配置文件包含了Hadoop通用配置,例如Hadoop的文件系统和I/O设置、Hadoop日志目录、Hadoop缓存设置等。2.hdfs-site.xml:该配置文件包含了Hadoop分布式文件系统(HDFS)的配置,例如HDFS的副本数、块大小、数据目录、安全设置等。3.yarn-site.xml:该配置文件包含了Hado......
  • 【hadoop】 3005-hadoop对象序列化编码
    一、hadoop序列化操作Writable接口,是根据 DataInput 和 DataOutput 实现的简单、有效的序列化对象MR的任意Key和Value必须实现Writable接口.MR的任意key必须实现WritableComparable接口二、自定义Writable,实现MapReduce程序1、需求内容日期 ......
  • 【hadoop】 4001-Partitioner编程
    MapReduce重要组件——Partitioner组件(1)Partitioner组件可以让Map对Key进行分区,从而可以根据不同的key来分发到不同的reduce中去处理;(2)你可以自定义key的一个分发股则,如数据文件包含不同的省份,而输出的要求是每个省份输出一个文件;(3)提供了一个默认的HashPartitioner......
  • 《暂时无法归类的知识点》
    Python默认解释器编码:utf-8计算机中的单位:位/字节/K/M/G/T/P修改hosts文件C:\Windows\System32\drivers\etc\hostsRCE:即远程命令执行。命令执行又称命令注入、代码执行等。核心原理是拥有变量的控制权。PHP命令执行函数:system/exec/passthru/shell_exec ......
  • 大模型知识点
    参数有效化微调(ParameterEfficientFineTuning,PEFT)参数有效化微调大致可以分为三个方法:Adapter、Prompt、LoRA LORA:LoRA的思想也很简单,在自注意力层的四个权重矩阵Wq,Wk,Wv,Wo的所有或者部分旁边增加一个旁路(如文中表示在GPT3上只有Wq和Wv加了旁路),做一个降维再升维的操......