`

hashcode的分析

 
阅读更多

首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
  总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
上面说的对象相同指的是用eqauls方法比较。
你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。

hashcode()是干什么用的?2008年09月29日 星期一 07:32 P.M.首先hashcode是哈希算法的一中简单实现,他是一个对象的哈希吗值。一般和equals一起使用。

hashcode也是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有
例如内存中有这样的位置
0 1 2 3 4 5 6 7
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。
但如果用hashcode那就会使效率提高很多。
我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除8求余数直接找到存放的位置了。

2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。
也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。
那么。重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊
3。你要对A类排序,有两种方法,一种就是让A类实现comparabole结构并实现compareTo()方法,那么可以通过Collections.sort(List <A> list)对其进行排序
另一种方法:自己定义一个类B实现Comparator类并实现compare方法,
然后通过Collections.sort(List <A> list,B b)进行排序

分享到:
评论

相关推荐

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...

    hashcode和equals的分析

    ### hashCode和equals方法详解 ...通过以上分析,我们可以看到`hashCode`和`equals`方法在Java中扮演着非常重要的角色,尤其是在集合框架中。正确地实现这两个方法可以大大提高程序的性能和可维护性。

    复写hashCode()方法,和equasl()方法

    #### 示例代码分析 在给定的代码示例中,`HashSet`被用来存储`Person1`类型的对象: ```java HashSet&lt;Person1&gt; hs = new HashSet(); hs.add(new Person1("a", 11)); hs.add(new Person1("b", 12)); hs.add(new ...

    equals 和 hashCode两者效果分析详解.docx

    在Java编程语言中,`equals()`和`hashCode()`方法是两个非常重要的概念,尤其是在处理对象比较和容器(如HashMap和HashSet)操作时。这两个方法在Java的类库中有着核心地位,尤其是对于类实例的比较和存储。接下来,...

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    hashcode与eqault比较

    #### 四、案例分析 假设有一个类`Person`,包含`name`和`age`两个属性: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; ...

    hashCode内存溢出和内存泄漏的问题解决.docx

    - 使用内存分析工具(如VisualVM、MAT等)定期进行内存快照分析,查找潜在的内存泄漏。 - 了解并遵循Java内存模型和垃圾收集的工作原理。 - 在处理资源密集型操作时,如数据库连接,使用连接池来管理资源。 总之,...

    java中hashcode和equals的详解.pdf

    通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java 集合的实现原理和哈希表的工作机制。 一、hashCode 方法简介 hashCode 方法是 Java 中 Object 类的一个方法,用于返回对象的哈希码值。这个...

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    hashcode使用方法

    #### 示例代码分析 ```java public class Example { private int id; private String name; // 构造器、getter 和 setter 省略 @Override public boolean equals(Object obj) { if (this == obj) return ...

    C#获得hashCode源码,可生成32位和64位,获得的结果不一样

    在C#编程语言中,`hashCode`是一个非常重要的概念,特别是在数据结构如哈希表(HashMap)中。`GetHashCode`方法是.NET框架中的一个关键组成部分,它为对象提供了一个整数值,这个值通常用于快速比较和定位对象。标题...

    hash表和hashCode1

    2. 数字分析法:分析键的数字特性来设计哈希函数。 3. 平方取中法:取键平方后的中间位作为哈希地址。 4. 折叠法:将键分割,取各部分的叠加和(舍去进位)。 5. 除留余数法:取键除以不大于表长的某个数的余数作为...

    set接口经常用的hashCode和equals方法详解

    #### 六、示例分析 假设我们有一个自定义类`Person`,我们需要为其实现`hashCode`和`equals`方法: ```java public class Person { private String name; private int age; // 构造函数和其他方法省略... @...

    hashcode2018:提交Hashcode 2018

    在"hashcode2018-master"这个压缩包中,很可能包含了我们团队在比赛期间编写的代码、解决方案文档、测试数据以及分析报告。通过这些文件,我们可以回顾当时的策略,学习如何运用哈希码和Python来解决实际问题。代码...

    hashcode2021:源HashCode 2021

    - 分析和优化哈希函数,减少哈希冲突 - 实战案例,如使用`hashCode()`优化数据结构的性能 - 探讨`hashCode()`在并发编程中的应用和注意事项 - Java集合框架中哈希码的使用 - 跟踪调试哈希冲突并解决实际问题 通过...

    hashcode

    通过学习和分析这些示例,开发者可以更好地理解如何在实际项目中适当地使用和实现`hashCode()`。 在实际开发中,`hashCode()` 的实现可以基于对象的属性来计算。通常,我们会将对象的关键属性进行位运算,如异或或...

    hashcode-framework:Hashcode PHP框架

    这可能涉及到数据的遍历、查找、排序以及矩阵运算等功能,对于Web应用中的数据分析和计算场景非常有用。 结合【标签】"HTML",我们可以理解Hashcode Framework不仅关注后端逻辑,还关注前端展示。HTML是超文本标记...

    软件构造心得(10):编写等价性判断时重写Hashcode的原因:理论与性能分析

    在软件开发中,特别是在使用基于哈希的集合类如HashSet或HashMap时,重写对象的`hashCode()`方法显得尤为重要。这是因为这些数据结构依赖于对象的`hashCode()`来快速定位和检索元素。`hashCode()`方法返回一个整数值...

    hashcode-2k21:我们团队的HashCode 2k21解决方案的仓库

    【哈希码(HashCode)2k21】是Google举办的一项年度编程挑战赛,HashCode旨在让参赛者通过解决实际的大型数据问题来提升算法和团队合作能力。在本仓库中,我们聚焦的是2021年的竞赛,团队成员们共同探讨并实施了解决...

    google-hashcode-2021:Google哈希代码2021

    在解压后的文件`google-hashcode-2021-main`中,可能包含样例数据、输入输出规范、问题描述以及可能的解决方案模板。团队需要分析这些问题,利用TypeScript编写程序,以满足题目要求,并尽可能地提高解决方案的评分...

Global site tag (gtag.js) - Google Analytics