我读了一本书,其中hashCode()
显示了一个内存区域,该区域有助于(例如HashSets
)在内存中找到合适的对象。但是,如果我们不能直接用Java操作内存,那怎么可能呢?没有指针,除了它,还创建了对象并将其从一个地方移动到另一个地方,而开发人员对此一无所知。
我读到这样的实现hashCode() {return 42;}
是可怕而可怕的,但是如果我们不能指示VM将对象放在哪里,有什么区别呢?
问题是:hashCode()
如果我们无法操纵内存,那么在深层次上的目的是什么?
我喜欢乔恩·斯基特([JonSkeet)的答案(+1),但它需要了解哈希表的工作原理。哈希表是一种数据结构,基本上是一个存储桶数组,它使用键的哈希码来确定将哪个存储桶粘贴到该条目中。这样,将来调用以检索该键上的所有内容时就不必筛选整个对象列表存储在哈希表中,哈希表可以计算密钥的哈希码,然后直接进入匹配的存储桶并查看。哈希码必须是可以快速计算的东西,您希望它是唯一的,但是如果不是这样,那不是一场灾难,除非在最坏的情况下(您的return 42;
),这很糟糕,因为一切都以相同的方式结束桶,然后您就可以仔细检查所有内容。
Object#hashCode的默认值可能基于诸如内存位置之类的东西,只是因为它是一个方便的随机数,但是由于对象在内存管理过程中被分流,因此该值被缓存了,无论如何也没人在意。由不同对象(例如String或BigDecimal)创建的哈希码当然与内存无关。这只是一个快速生成的数字,您希望它是唯一的。
问题内容: 鉴于这种: 输出为: 这是为每个对象提供false,但每个String对象的哈希码都相同。为什么会这样呢? 问题答案: 确实比较 对象的 真实相等性(我的意思是-两个引用都指向同一个对象),而不是它们的内容,而比较内容(至少对于String)。 并指向不同的对象。 还要注意,如果对象相等,则它们的哈希必须相同,但是如果哈希码相同,则并不意味着对象相等。
本文向大家介绍Java中的hashcode方法介绍,包括了Java中的hashcode方法介绍的使用技巧和注意事项,需要的朋友参考一下 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。 为何Objec
问题内容: 我了解hashCode的思想以及为什么需要它。但是我对如何为通用对象计算hashCode感到困惑。所以这是我的问题。如果我有一个String,我可能会使用以下函数来计算hashCode, 但是说我有以下目的, 我的IDE为此生成了一个自动的hashCode函数, 我的问题是,由于键和值是通用的,该怎么办?这种方法如何运作? 问题答案: 和是参数化类型的的对象。 这样,将在实际类型上被调
问题内容: Bert Bates和Kathy Sierra的SCJP 6学习指南在第554页中指出(除其他要求外) x.hashCode()!= y.hashCode()要求x.equals(y)== false 。 但是Javadoc for Object并未明确提及此类要求。Quote: 如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法
本文向大家介绍详解Java中hashCode的作用,包括了详解Java中hashCode的作用的使用技巧和注意事项,需要的朋友参考一下 详解Java中hashCode的作用 以下是关于HashCode的官方文档定义: 以上这段官方文档的定义,我们可以抽出成以下几个关键点: 1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构
本文向大家介绍java 中HashCode重复的可能性,包括了java 中HashCode重复的可能性的使用技巧和注意事项,需要的朋友参考一下 java 中HashCode重复的可能性 今天有同事提议用String的hashcode得到int类型作为主键。其实hashcode重复的可能性超大,下面是java的缺省算法: 但是什么情况下会重复?下面是测试代码 在A-z范围内有特殊字符,从结果看,