对象相等和一致性

JAVA对象一致性比较(属性值) JAVA对象属性比较实现HashCode方法序列化方法反射比较 HashCode方法 该方法也是最为正规的方法,重写对象的hashCode与equals方法,可以实现对象间相等性比较的判断。 序列化方法 该方法是将A和B对象分为JSON序列化成字符串,利用字符串的来进行对象相等性比较。简单贴一下代码: public static boolean seniorCompare(Object srcOb... 阅读详情

在对象比较中,对象一致和对象相等:

简单的讲:相等性(quality)就是两个对象,它们的值相等。同一性(identity)就是指引用的是否为同一个对象。 

 

下面是我的读书笔记: 

 

C# 中有两种不同的相等:引用相等和值相等。值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。例如,两个值为 2 的整数具有值相等性。引用相等意味着要比较的不是两个对象,而是两个对象引用,这两个对象引用所引用的是同一个对象。我们这里把值相等叫做对象的“相等性(equality)”,把引用相等叫做对象的同一性(identity)。 

 

我们都知道在System.Object类型中提供了一个名为Equals的虚方法,它的作用是在两个对象相等的情况下返回true,不相等时返回false。等等,这里的说的“相等”是哪个?是“相等性(equality)”还是“同一性(identity)”。好吧,来看一下代码吧,System的Object方法是像下面这样实现的: 

 

public class Object 

{ 

public virtual Boolean Equals(Object obj) 

{ 

// 如果两个引用指向的是同一个对象,那么它们肯定相等 

if (this == obj) return true; 

 

// 假定对象不相等 

return false; 

} 

} 

 

表明上看它好像是实现的很合理:假如this和Obj引用同一对象,自然就是true了,因为Equals知道一个对象肯定等于它自身。然而,如果this和Obj引用不同的对象哪?,Equals就不能肯定对象是否包含相同的值,所以总结一句话就是:Object的Equals方法实现的只是“同一性(identity)”,而不是“相等性(equality)”。 

 

多么的令人遗憾啊~!Object的Equals的默认实现并不合理,既然不合理我们就来重写它吧,先来看看如何在内部正确实现一个Equals方法(我把它概括为四个字——空、型、值、基): 

 

如果obj参数为null,就返回false; 

如果this和obj参数引用不同的类型对象,返回false; 

针对类型定义的每个实例字段,将this对象的值和obj对象的值进行对比,任何字段不相等,就返回false; 

调用基类的Equals方法,以便比较它定义的任何字段。如果基类的Equals方法返回false,就返回false;否则返回true; 

再来看一下Object的Equals方法的实现代码: 

 

public class Object 

{ 

public virtual Boolean Equals(Object obj) 

{ 

if (obj == null) return false; 

 

if (this.GetType() != obj.GetType()) return false; 

 

// 如果对象属于相同的类型,那么在它们的多有字段都匹配的前提下返回true 

// 由于System.Object没有定义任何字段,所以字段是匹配的 

return true; 

} 

} 

 

其实,这里要说一下,Microsoft并没有这样去实现他的代码,而是要比这个复杂的多的多。 

 

那么Equals方法可以在子类中重写,那么就不可以用Equals方法来测试同一性(identity)了。怎么办啊?Microsoft在Object中提供了一个静态方法ReferenceEquals,其原型如下: 

 

public class Object 

{ 

public static Boolean ReferenceEquals(Object objA, object objB) 

{ 

return (objA == objB); 

} 

} 

 

注意了啊,如果想要检查同一性(identity),那么务必调用ReferenceEquals,而不应该使用C#的==操作符(除非事先把它们转化为Object类型),原因是其中某个操作数的类型可能重载了==操作符,为其赋予了其它语义。 

 

另外,System.ValueType重写了Object的Equals方法。并进行了正确的实现来执行相等性(equality)检查,而不是同一性(identity)检查。在内部,ValueType的Equals方法是像这样实现的: 

 

如果obj参数为null,返回false; 

如果this和obj引用的不同类型的对象,返回false; 

针对类型定义的每个实例字段,都将this对象的值和obj对象中的值进行比较。如果有字段不相等,就返回false; 

返回true;ValueType的Equals的方法不会调用Object的Equals方法。 

顺便说一下,ValueType的Equals方法是通过反射技术来完成的。由于CLR反射机制较慢,所以在定义自己的值类型时,应该重写Equals方法,并提供自己的实现,以便提高性能。当然在自己的实现中不要调用base.Equals。 

 

要重写Equals,必须遵循一下几点特性: 

 

x.Equals(x) 返回 true。 (自反性) 

x.Equals(y) 与 y.Equals(x) 返回相同的值。 (对称性) 

如果 (x.Equals(y) && y.Equals(z)) 返回 true,则 x.Equals(z) 返回 true。 (传递性) 

只要不修改 x 和 y 所引用的对象,x.Equals(y) 的后续调用就返回相同的值。 (一致性) 

x.Equals(null) 返回 false。

 

 

另一人回答:对象们都住在不同的房间里,每个房间只能住一个对象.对象们都被锁在房间里,永远没有办法搬家(至少从我们讨论的角度来说,这个说法是正确的).所以如果你知道了一个对象的房间号,就能找到对应的对象. 

 

现在假如我们有两张名片,上面如果写着相同的房间号,我们就可以断定,这两张名片是同一个对象分发出来的,这就是同一性,也就是你所说的一致. 

 

假如1号房里住着一个值为1的整数对象, 2号房里住着另一个值为2的整数对象,3号房里住着另另一个值为1的整数对象.我们又有它们各自的一张名片, 那么,第一个名片和第三个对应的对象的值是相等的,但是它们不是同一个对象,用你的词来说,也就是说它们"相等",但不"一致". 

 

如果上面说得太清楚了,那么这里让你再困扰一会吧,哈哈: 

这里的名片就是引用(i, count之类的变量/字段等的名称); 

房间所在的大楼就是内存,房间号就是内存地址. 

对象就是内存里保存的数据.

Java-对象相等判断 Java-对象相等判断引用相等性和对象相等性引用相等性对象相等性equals和hashCodeequalsJDK中说明了实现equals()方法应该遵守的约定:hashCodehash码相同的情况hash码不相同的情况JDK中对hashCode()方法的作用,以及实现时的注意事项做了说明:重写equals和hashCode例子 引用相等性和对象相等性 引用相等性 两个引用指向堆上同一个对象,成为引... 阅读详情

相关推荐

Java中的equals方法:对象相等性比较

在上面的示例中,我们定义了一个名为Person的类,并重写了equals方法。根据具体的类和相等性规则,我们可以在自定义类中重写equals方法,以实现根据对象的内容进行比较。根据我们在Person类中定义的相等性规则,person1与person2的name和age属性不相等,因此equals方法返回false;例如,我们使用了name.equals(person.name)来比较name属性,这样可以确保name不为null时才进行比较,避免了NullPointerException的风险。

TechWhizKid的博客 373

对象等同性的分析与实现 - C#

当我们创建自己的类型时(无论是class还是struct),都应为类型定义“等同性”的含义。 C#提供了4种不同的函数来判断两个对象是否“相等”。 public static bool ReferenceEquals(object left, object right); public static bool Equals(object left, object right); public virtual bool Equals(object obj); public static bool operat

rocket2002的博客 1202

掌握Java对象相等性的秘密:equals()与hashCode()

本文深入探讨了Java中对象相等性判定的核心方法:equals()和hashCode()。通过实例演示了正确实现equals()方法的要点,包括对参数类型的检查、字段比较以及hashCode()方法的规则和实现技巧。文章还强调了在重写equals()时必须同时重写hashCode()的重要性,以及如何确保这两个方法在逻辑上保持一致。

weixin_35509395的博客 373

对象的相等和引用相等的区别

当两个对象在逻辑上或内容上相等时,我们称这两个对象是相等的。这通常意味着两个对象具有相同的属性值或满足某种特定的相等条件。

m0_56653160的博客 558

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 417

angular中访问本地json文件

先在assets文件夹下写一个json文件,这样在打完包之后也可以手动修改json文件内容 1、在需要访问本地json文件的ts文件里面引入 import{HttpClient}from'@angular/common/http'; 2、用ajax请求调用,我这里是用已经封装好的ajax请求调用 gethttp = ()=>{ var self = this self.ajax.getAjax("../../assets/server.json","g...

蜗牛~~ 1828

对象的相等与指向他们的引用的相等有什么区别

对象的相等是指对象所存储的内容是否相等,引用相等是指引用所指向的地址是否相等。

weixin_46281126的博客 1548

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

在对象比较中,对象相等和对象一致分别指的是什么?

对象数据存内存堆里,对象一致即内存堆相同,对象相等为哈希表中键同值可能不同 简单的讲:相等性(quality)就是两个对象,它们的值相等。同一性(identity)就是指引用的是否为同一个对象。 下面是我的读书笔记: C# 中有两种不同的相等:引用相等和值相等。值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。例如,两个值为 2 的整数具有值相等性。 引用相等意...

awpvquv779994932的博客 440

描述符链表(Descriptor Chain)是什么?

描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。

guigenyi的专栏 772

大模型-CLIP 详细介绍

最先进的计算机视觉系统通常被训练来预测一组预定义的对象类别。这种受限的监督形式限制了它们的通用性和可用性,因为要指定任何其他视觉概念,就需要额外的标注数据。比如,它们可以识别“猫”、“狗”、“汽车”等。但是,这种做法有一个明显的局限性:如果你想让系统识别一个新的类别,比如说“独角兽”,你就必须提供大量带有“独角兽”标签的图片来训练系统。这不仅耗时费力,而且限制了系统的灵活性和广泛适用性。直接从原始文本中学习关于图像的信息是一种很有前途的替代方案,因为它利用了更广泛的监督来源。

晓的博客 9706

hashcode相等的两个对象一定相等吗_hashCode为什么存在?

这篇文章我想讲讲equals()和hashCode()的区别,这两个方法是Object类使用最频繁的两个方法,也是面试官考察基础时比较喜欢提问的两个方法。首先,话不多说,一句话总结:equals()用于判断两个对象是否相等,这是大家公认的。hashCode()被设计是用来使得哈希容器能高效的工作。为什么这么说?在Java中,有一些哈希容器,比如Hashtable,HashMap等等。当我们调用这些...

weixin_32440261的博客 1926

【雕爷学编程】Arduino动手做(45)---红外光电避障传感器模块4

雕爷学编程,Arduino动手做,开源硬件,创客传感器,红外光电避障传感器模块

雕爷学编程 2503

两个变量引用的对象要怎样才算相等?

两个变量引用的对象要怎样才算相等? 两个变量引用的对象要怎样才算相等? 引用完全相同的对象,还是有相同状态和行为的不同对象也算? 这是一个很关键的议题:引用相等性和对象相等性。 1. 引用相等性:堆上同一个对象的两个引用 也就是说两个引用变量引用的就是同一个对象,hashCode()默认的行为会返回每个对象特有的的序号,大部分是根据内存位置计算的。既然本就是同一个对象,hashCode()自然是一样的,两个引用自然也是相等的 2.对象相等性:堆上的两个不同对象在意义上是相同的 理论上来说要让两个不同的对象视

weixin_45847561的博客 748

YOLO26涨点改进 | 检测头改进篇 | 利用ASFF改进YOLO26检测头,自适应空间特征融合模块,在所有的目标检测上均有大幅度的涨点效果

本文提出了一种自适应空间特征融合(ASFF)检测头YOLO26,用于解决目标检测中特征金字塔跨尺度特征不一致的问题。ASFF通过学习空间权重图,自适应地融合不同尺度的特征,抑制特征层间的冲突信息。实验表明,该方法在MSCOCO数据集上显著提升了检测精度(45FPS下AP达42.4%),且仅引入极小推理开销。ASFF模块具有可微分性、模型无关性和计算成本低等优势,能够有效改善特征尺度不变性,实现速度与精度的良好平衡。文章详细介绍了ASFF的原理、实现代码及其在YOLO模型中的集成方法。

Ai缝合怪、助力小伙伴高效发论文 547

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

面试题练习——hashcode相等两个类一定相等吗?equals呢?相反呢

1.分析 hashcode 源码 hashcode()返回对象的哈希码值。比如java.util.HashMap提供的散列表 hashcode规则使用如下: 在Java应用程序执行期间多次对同一个对象调用hashCode方法时,只要没有修改在对象上的 equals 比较中使用的信息,该方法就必须一致地返回相同的整数。此整数不需要在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。 如果两个对象根据 equals(Object) 方法是相等的,那么对这两个对象调用hashCode方法必须产

weixin_46056331的博客 535

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何判断两个对象是否相等

① 首先比较两个对象的长度,如果长度不相等使flag为false,为不相等; ② 如果长度相等那就遍历对象1(对象2也可以),利用hasOwnProperty() 【哈斯欧尼PROpt】方法查看对象1中是否包含对象2中的属性或者方法,如果不包含则使flag为false,为不想等。 hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。 ③ 接下来判断两对象的内存地址是否相同,不同则为true ...

weixin_50388521的博客 3997

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# 中对象相等性判断的全面解析

objB);obj);该方法定义在中,可被重写。objB);C# 中的“相等”是一个多层次、多语义的问题。理解这四种方式的差异,不仅能避免隐藏 bug,还能写出更健壮、可维护的代码。

无风听海 529

java什么叫一致性,Java 中的相等性和一致性

当在 Set 中存储对象时同样一个对象是不能够存储两次的,这是 Set 的核心定义。在 Java 中,有两个方法分别用来决定两个引用对象是否相同和它们是否都能存在于 Set 中,这两个方法是 equals() and hashCode() 。接下来我将解释下相等性和一致性之间的区别以及它们各自相对来说的优点。Java 为这两个方法都提供了标准的实现,不过标准 equals() 方法定义成一个做相似...

weixin_30311521的博客 695

hashCode一样,2个对象相等吗

如果重写了hashcode 那么他的返回值 就是不是对象的堆内存的引用地址了。如果2个hashcode一样 那么他的对象equals不一定相等。如果2个对象equals相等 那么2个hashcode必须相等。如果重写了equals方法 那么必须重写hashcode方法。默认情况下hashcode 存储的是对象在堆内存的地址。这样结果才是true。

qq_21277357的博客 1198

java对象equals方法的重写

根类Object中的equals方法描述: publicbooleanequals(Objectobj)Theequalsmethod for classObjectimplements the most discriminating possible equivalence relation on objects; that is, for any non-null r...

dixianmm198686的博客 199

java中如何判断对象相等_Java中如何判断两个对象是否相等

如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解。从以下几个点来理解equals和hashCode方法:1、equals的作用及与==的区别。2、hashcode的作用及与equals的关系。1、equals的作用及与==的区别。equals被用来判断两个对象是否相等。equals通常用来比较两个对象的内容是否相等,==用来比较两个对象的地址是否相等...

weixin_29258865的博客 378

hashCode相同,两个对象不一定相等 学习过程

java中的==: java中的==比较的是两个对象的jvm的地址 java中的equals(): public boolean equals(Object obj) { return (this == obj); } 查看源码可以看到默认的equals直接调用==的进行判断,判断对象的地址. java中的hashcode(): 默认情况下,Object中的hashCode() 返回对象...

weixin_44261856的博客 3943

"一致性相等"的陷阱[转]

原文链接:http://www.blogjava.net/jiangshachina/archive/2012/12/06/392569.html关于Object类中的equals()方法与Comparable接口中的compareTo()方法之间有何种关联,之前还真没考虑过。通过java.net看到此文之后,收获了一点儿新知识,希望大家也能如此。方法equals()与Com...

weixin_34200628的博客 85

[软件构造]相等

抽象函数:抽象函数将具体的数据映射到抽象的值,如果AF(a)=AF(b),我们就说a和b相等。等价关系:等价是指对于关系,满足自反性,对称性,传递性。则我们说a等于b当且仅当E(a,b)。观察:两个对象a和b相等当且仅当使用者无论怎样观察总会得到相同的结果。==比较的是索引。如果两个变量==,那么它们指向同一块存储区域,在快照图中展现为它们的箭头指向同一个对象。.equals()操作是比较对象的内容。比较的是两个对象的值是否相等。equals方法在是在object方法下定义的,在每个ADT中,都必须对equ

m0_53655700的博客 179
上一篇: How do I create delegates in Objective-C?
下一篇: dequeueReusableCellWithIdentifier
iphoneing
博客等级 码龄16年 12粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值