Tag: 等于

正确实现GetHashCode

我想从社区听到我应该如何去实现GetHashCode(或覆盖它)为我的对象。 我知道我需要这样做,如果我重写equals方法。 我已经实现了相当多的时间,有时只是调用基本方法。 我明白,如果对象包含相同的细节(成员),我的对象应该等于该对象的另一个实例。 从类的成员获取哈希代码的最好方法是什么?

重叠等值法在结构中的应用

我已经寻找结构的压倒一切的指导方针,但我能find的只是课程。 起初,我想我不会检查,看看传递的对象是否为null,因为结构是值types,不能为空。 但现在我想起来了,就像平等签名一样 public bool Equals(object obj) 似乎没有任何东西阻止我的结构的用户试图比较它与任意的引用types。 我的第二点是关于在我比较我的结构中的私有字段之前,我想(我想)。 我该如何将对象转换为我的结构types? C#的关键字似乎只适用于引用types。

如何比较两个string,当两者都可以为空?

我知道最好使用==运算符来调用equals方法(请参阅此问题 )。 如果两个string都为null或者它们表示相同的string,我想要两个string进行比较。 不幸的是,如果string为null则equals方法将抛出一个NPE 。 我的代码目前是: boolean equals(String s1, String s2) { if (s1 == null && s2 == null) { return true; } if (s1 == null || s2 == null) { return false; } return s1.equals(s2); } 这是不雅的。 什么是正确的方法来执行这个testing?

为可变对象重写GetHashCode?

我已经读过关于何时以及如何重写GetHashCode 10个不同的问题,但仍然有一些我不太明白。 GetHashCode大部分实现都基于对象字段的哈希码,但是被引用的是, GetHashCode的值不应该在对象的生命周期中改变。 如果它基于的字段是可变的,它是如何工作的? 另外,如果我想要字典查找等基于参考平等而不是我重写的Equals ? 我主要覆盖Equals的unit testing我的序列化代码,我假设序列化和反序列化(在我的情况下XML)杀死引用相等,所以我想确保至less它是正确的值相等。 在这种情况下这是不好的做法覆盖Equals ? 基本上在大多数执行代码我想引用相等,我总是使用== ,我不重写。 我应该只是创build一个新的方法ValueEquals或东西,而不是重写Equals ? 我曾经假设框架总是使用==而不是Equals来比较事物,所以我认为覆盖Equals是安全的,因为在我看来,它的目的是为了如果你想有一个平等的第二个定义是不同的==运算符。 从阅读其他几个问题,但似乎并非如此。 编辑: 看来我的意图还不清楚,我的意思是99%的时候我想要老旧的参考平等,默认行为,没有什么意外。 对于非常罕见的情况,我希望具有值相等性,并且我希望通过使用.Equals而不是==来明确请求值相等。 当我这样做时,编译器build议我重写GetHashCode ,这就是这个问题的出现。 当应用于可变对象时,似乎存在与GetHashCode相矛盾的目标,那些目标是: 如果a.Equals(b)则a.GetHashCode()应该== b.GetHashCode() 。 a.GetHashCode()的值不应该在a的生命周期中改变。 当一个可变对象出现时,这些看起来自然是矛盾的,因为如果对象的状态发生变化,我们期望.Equals()的值改变,这意味着GetHashCode应该改变以匹配.Equals()中的改变,但是GetHashCode不应该更改。 为什么似乎有这个矛盾呢? 这些build议是不是适用于可变对象? 可能假设,但可能值得一提的是我指的是类而不是结构。 parsing度: 我将JaredPar标记为已接受,但主要针对评论交互。 总结一下,我从中学到的是,实现所有目标和避免在边缘情况下可能出现的奇怪行为的唯一方法是仅基于不可变字段覆盖Equals和GetHashCode ,或者实现IEquatable 。 这种似乎减less了重写Equals for引用types的用处,因为从我看到的大多数引用types通常没有不可变的字段,除非它们被存储在关系数据库中用它们的主键标识它们。

强制类重写.equals方法

我有一堆实现了一个通用接口的类:Command。 而这一堆class去了一个地图。 为了使地图工作正常,我需要实现Command的每个类来覆盖Object.equals(Object other)方法。 没关系。 但是我想强迫平等的压倒一切。 =>执行命令的人不会覆盖等于编译错误。 这可能吗? 编辑:顺便说一句,我还需要强制重写hashcode …

toString(),equals()和hashCode()

所以,我有一个需要实现的一堆方法的接口,方法名称是不相关的。 实现这个接口的对象通常被放入集合中,并且还有我希望它们使用的特殊的toString()格式。 所以,我认为将hashCode(),equals()和toString()放入界面会很方便,以确保我记得覆盖这些的默认方法。 但是,当我将这些方法添加到接口时,如果我没有实现这三个方法,那么IDE /编译器就不会抱怨,即使我明确地将它们放在接口中。 为什么这不会被强制执行? 它抱怨说,如果我不执行任何其他方法,但它不执行这三个。 是什么赋予了? 任何线索?

在Javascript中比较NaN值是否相等

我需要在Javascript中比较两个数值的相等性。 值也可以是NaN 。 我已经拿出这个代码: if (val1 == val2 || isNaN(val1) && isNaN(val2)) … 这工作正常,但它看起来臃肿。 我想使它更简洁。 有任何想法吗?

在子类中重写equals()&hashCode()…考虑超级域

是否有一个具体的规则如何覆盖equals()和hashCode()在考虑超级字段的 子类 ? 知道有很多参数:超级字段是私人/公共,有/没有getter … 例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和 new HomoSapiens("M", "80", "1.80", "Cammeron", "VeryHot").equals( new HomoSapiens("F", "50", "1.50", "Cammeron", "VeryHot")) 将返回真实:( public class Hominidae { public String gender; public String weight; public String height; public Hominidae(String gender, String weight, String height) { this.gender = gender; this.weight = weight; this.height = height; } … } public class HomoSapiens […]

如何比较数组列表与现代Java的平等?

我有两个数组列表。 如何轻松比较这些与Java 8及其function的平等,而不使用外部库? 我正在寻找比这样的暴力代码更好的(更高级的,更短的,更高效的)解决scheme(未经testing的代码,可能包含错别字等,而不是问题的要点): boolean compare(List<String[]> list1, List<String[]> list2) { // tests for nulls etc omitted if(list1.size() != list2.size()) { return false; } for(i=0; i<list1.size(); ++i) { if(!Arrays.equals(list1.get(i), list2.get(i))) { return false; } } return true; } 或者,如果没有更好的方法,那也是一个有效的答案。 奖金:如果Java 9提供更好的Java 8可以提供的更好的方式,请随时提及它。 编辑:在看了这些注释之后,看看这个问题是如何变得温和的,我认为“ 更好 ”应该包括在检查数组内容之前首先检查所有数组的长度 ,因为如果内部的内部有潜在的不平等数组很长。

运算符在C#中使用基于接口的编程重载

背景 我在当前项目上使用基于接口的编程,并且在重载操作符(特别是Equality和Inequality操作符)时遇到了问题。 假设 我正在使用C#3.0,.NET 3.5和Visual Studio 2008 更新 – 以下假设是错误的! 要求所有的比较使用Equals而不是运算符==不是一个可行的解决scheme,尤其是当您的types传递到库(如集合)。 我担心需要使用Equals而不是运算符==的原因是,我无法在.NET指南中的任何地方find它会使用Equals而不是运算符==甚至提示它。 但是,在重新读取等式和运算符==的指导原则后,我发现: 默认情况下,运算符==通过确定两个引用是否指示相同的对象来testing引用相等性。 因此,引用types不必为了获得这个function而实现operator ==。 当一个types是不可变的,也就是说,实例中包含的数据是不能改变的,重载operator ==来比较值相等而不是引用相等可以是有用的,因为作为不可变对象,它们可以被认为是长因为它们具有相同的价值。 在非不可变types中重写operator ==不是一个好主意。 和这个Equatable接口 当在Contains,IndexOf,LastIndexOf和Remove等方法中testing相等性时,IEquatable接口被generics集合对象(如Dictionary,List和LinkedList)使用。 应该为可能存储在通用集合中的任何对象执行。 约束上 任何解决scheme都不一定需要将对象从接口转换为具体的types。 问题 当运算符==两端都是一个接口时,底层具体types中的operator ==重载方法签名将不匹配,因此将调用默认的Object operator ==方法。 在类上重载运算符时,二元运算符的至less一个参数必须是包含types,否则会生成编译器错误(错误BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx ) 无法在接口上指定实现 请参阅下面的代码和输出以显示问题。 题 在使用基于接口的编程时,如何为您的类提供正确的操作符重载? 参考 ==运算符(C#参考) 对于预定义的值types,如果操作数的值相等,则相等运算符(==)返回true,否则返回false。 对于string以外的引用types,如果其两个操作数引用同一个对象,则==返回true。 对于stringtypes,==比较string的值。 也可以看看 码 using System; namespace OperatorOverloadsWithInterfaces { public interface IAddress : IEquatable<IAddress> […]