Tag: hashcode

为什么不同的布尔实例的哈希代码总是相同的?

在下面的代码中,哈希码总是相同的。 为什么这样? 码: public class BooleanClass { public static void main(String[] args) { Boolean b1 = new Boolean(true); Boolean b2 = new Boolean(false); Boolean b3 = new Boolean(true); Boolean b4 = new Boolean(false); Boolean b5 = new Boolean(false); Boolean b6 = new Boolean(true); System.out.println(b1.hashCode()); System.out.println(b2.hashCode()); System.out.println(b3.hashCode()); System.out.println(b4.hashCode()); System.out.println(b5.hashCode()); System.out.println(b6.hashCode()); } } 输出: 1231 1237 1231 […]

有关如何正确覆盖object.GetHashCode()的一般build议和指导原则

根据MSDN ,哈希函数必须具有以下属性: 如果两个对象相等,每个对象的GetHashCode方法必须返回相同的值。 但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值。 对象的GetHashCode方法必须始终返回相同的哈希码,只要不会修改确定对象Equals方法的返回值的对象状态。 请注意,这仅适用于应用程序的当前执行,并且如果应用程序再次运行,则可以返回不同的散列码。 为了获得最佳性能,散列函数必须为所有input生成一个随机分布。 我不断发现自己在以下情况:我已经创build了一个类,实现了IEquatable<T>并重写IEquatable<T> object.Equals(object) 。 MSDN指出: 覆盖Equals的types也必须覆盖GetHashCode; 否则,Hashtable可能无法正常工作。 然后它通常会阻止我一点。 因为,你如何正确覆盖object.GetHashCode() ? 从来没有真正知道从哪里开始,这似乎是一个很大的陷阱。 在StackOverflow中,有很多与GetHashCode覆盖有关的问题,但是其中大部分似乎都是针对特定情况和特定问题。 所以,我想在这里得到一个很好的汇编。 一般build议和指导方针的概述。 该怎么做,不该做什么,常见的陷阱,从哪里开始等等。 我希望它特别针对C#,但是我认为它对于其他.NET语言也是如此(?)。 我想也许最好的办法是先用快速简短的答案为每个主题创build一个答案(如果可能的话,接近一行),然后可能会有更多的信息,并结束相关的问题,讨论,博客文章等。 ,如果有的话。 然后,我可以创build一个职位作为接受的答案(顶部),只是一个“目录”。 尽量保持简短。 不要只链接到其他问题和博客文章。 尝试把它们的本质,然后链接到源代码(尤其是源代码可能会消失。另外,请尝试编辑和改进答案,而不是创build很多非常相似的代码。 我不是一个很好的技术作家,但是我至less会尝试devise一些格式相似的答案,创build目录等等。我也会尝试在这里search一些相关的问题,这些,也许拉出我可以pipe理的精髓。 但是由于我对这个话题不太稳定,所以我会尽量远离:

GetHashCode覆盖包含generics数组的对象

我有一个包含以下两个属性的类: public int Id { get; private set; } public T[] Values { get; private set; } 我已经使IEquatable<T>并覆盖IEquatable<T>像这样: public override bool Equals(object obj) { return Equals(obj as SimpleTableRow<T>); } public bool Equals(SimpleTableRow<T> other) { // Check for null if(ReferenceEquals(other, null)) return false; // Check for same reference if(ReferenceEquals(this, other)) return true; // Check for same […]

JVM如何确保System.identityHashCode()永远不会改变?

通常, Object.hashCode()的默认实现是内存中对象的分配地址的一些函数(虽然这不是JLS所要求的)。 鉴于VM分stream内存中的对象,为什么System.identityHashCode()返回的值永远不会在对象的生命期内更改? 如果是“一次性”计算(对象的hashCode被计算一次并隐藏在对象头部或某物中),那么这是否意味着两个对象可能具有相同的identityHashCode (如果它们碰巧是首先分配的在内存中的相同地址)?

Java中variables的内存地址

请看下面的图片。 当我们使用new关键字在java中创build一个对象时,我们从OS获取一个内存地址。 当我们写出out.println(objName)我们可以看到一个“特殊的”string作为输出。 我的问题是: 这是什么输出? 如果是由操作系统给我们的内存地址: a)如何将此string转换为二进制文件? b)如何获得一个整数variables地址?

Boolean.hashCode()

类Boolean的hashCode()方法是这样实现的: public int hashCode() { return value ? 1231 : 1237; } 为什么使用1231和1237? 为什么不是别的?

Java如何在HashMap或HashTable中订购商品?

我想知道Java如何在Map ( HashMap或Hashtable )中添加项目时进行订购。 密钥是由哈希码,内存引用还是按分配优先顺序sorting的? 这是因为我注意到在Map中相同的对不总是在相同的顺序

如何获取覆盖hashCode()的对象的唯一标识符?

当Java中的一个类没有重写hashCode()时 ,打印这个类的实例会给出一个很好的唯一编号。 Object的Javadoc说关于hashCode() : 尽可能多地合理实用,由类Object定义的hashCode方法确实为不同的对象返回不同的整数。 但是当类重写hashCode()时 ,我怎样才能得到它的唯一编号?

什么是实现__hash __()的正确和好方法?

什么是实现__hash__()的正确和好方法? 我正在讨论的函数返回一个哈希码,然后用来插入哈希表又名字典的对象。 作为__hash__()返回一个整数,并用于“binning”对象到哈希表中我假设返回的整数值应该为公共数据均匀分布(以最小化冲突)。 获得这种价值的好习惯是什么? 碰撞是一个问题吗? 在我的情况下,我有一个小class,充当一个容器类,持有一些整数,一些浮点数和一个string。