精华内容
下载资源
问答
  • java hashCode方法返回值

    2021-02-26 21:19:24
    hashCode 是和内存地址相关的一个整数。...总之,重写 hashCode 是为了让 Java 中所有使用到 Hash 算法的数据结构能够正常运行Java 中,Object 对象的 hashCode() 方法会根据不同的对象生成不同的哈希值,默...

    hashCode 是和内存地址相关的一个整数。

    HashCode只是在需要用到哈希算法的数据结构中才有用

    用途是为了方便快速地查找对象: HashMap 是根据键对象的 HashCode 来进行快速查找的。

    总之,重写 hashCode 是为了让 Java 中所有使用到 Hash 算法的数据结构能够正常运行

    Java 中,Object 对象的 hashCode() 方法会根据不同的对象生成不同的哈希值,默认情况下为了确保这个哈希值的唯一性,是通过将该对象的内部地址转换成一个整数来实现的。

    HashCode 其实只是在需要用到哈希算法的数据结构中才有用,比如在 HashMap 和 Hashtable中。

    HashCode 的用途是为了方便快速地查找对象,当你重写了 hashCode() 后,HashCode 就不再是默认的对象内部地址了,而是你自己定义的一个值。

    举个例子你或许更明白点:假如 a 和 b 是两个对象,你重写了 equals() 方法,你的目的肯定是希望它们两个相等。

    现在有一个 HashMap,它的值是这样的 map.put(a,c); map 中插入了一条数据,键是 a 值是 c,现调用 map.get(a) 可以返回对象 c,但是调用 map.get(b); 却不能返回对象 c, 而在你最开始的定义中,a 和 b 两个对象是相等的,相等的对象却得不到相同的结果,这段代码就不符合逻辑了。因为 HashMap 是根据键对象的 HashCode 来进行快速查找的,所以你必须保证 a 和 b 这两个相同对象的 HashCode 也相同,因此你需要重写 hashCode() 方法。另外,如果你要用到 HashSet,在这个例子中 a 和 b 可以同时插入到 HashSet 中,然而这两个对象在逻辑上有时相等的,这不符合 HashSet 的定义。

    总之,重写 hashCode 是为了让 Java 中所有使用到 Hash 算法的数据结构能够正常运行,当然如果你保证你的程序中完全不会用到 Hash 算法,那么你也可以不用重写。

    展开全文
  • java hashcode方法

    2021-02-12 12:39:49
    什么是hashcode方法?hashCode()方法作用是返回一个int类型的数值,也就是哈希值,该方法的主要作用就是在散列的储存结构中确定对象的储存地址,哈希值相同的对象会存放在同一个桶里,所以哈希值相同不代表两个对象...

    什么是hashcode方法?

    hashCode()方法作用是返回一个int类型的数值,也就是哈希值,该方法的主要作用就是在散列的储存结构中确定对象的储存地址,哈希值相同的对象会存放在同一个桶里,所以哈希值相同不代表两个对象就相等了。

    对象的hashcode怎么得到?

    hashcode就是通过hash函数得来的,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应的位置。hashcode只是代表了在hash表中的位置,和对象实际上的地址是不等同的,所以hashcode就是对象的地址的说法是错误的,一个对象肯定有它的物理地址,物理地址说的才是对象在内存中的地址。hashcode是通过对象的物理地址转换为的一个整数,然后该整数通过hash函数算法才得到的hashcode,这个hashcode对应对象在哈希表中的位置。

    具体过程是如何实现的呢?举例,假如哈希表中有6个位置,分别为1,2,3,4,5,6一个对象的物理地址转换为整数13,13%6=1,那么,它就被分配到哈希表1这个位置,它的hashcode也为1,同理,别的对象如果hashcode也为1那么它也会被分配到哈希表的1位置。

    为什么hashcode不直接写物理地址呢,还要另外用一张hash表来代表对象的地址?

    因为HashCode的存在主要是为了查找的快捷性,如Hashtable,HashMap等HashCode是用来在散列存储结构中确定对象的存储地址的(后半句说的用hashcode来代表对象就是在hash表中的位置)

    从Object角度看,JVM每new一个Object,它都会将这个Object丢到一个Hash表中去,这样的话,下次做Object的比较或者取这个对象的时候(读取过程),它会根据对象的HashCode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。若HashCode相同再去调用equal。

    至于为什么hashcode查找效率高,可以举一个例子,1000个空位存放1000个不重复的数,最直接粗暴的方法就是每存一个数就对之前的数进行遍历,看看有没有重复的,这样效率是非常低下的。我们可以用hash表来提高效率,假如哈希表有8个位置1、2、3、4、5、6、7、8,存第一个数它对应哈希表中1的位置,如果已经存了100个不相同的数,位置1里有10个,那么101个数的hashcode为1,那么只需要与hashcode为1位置的其它10个数进行比较即可,不用遍历其它所有数,当哈希表的位置越多那么你比较的次数就会越少。

    equals()方法与hashcode()

    我们可以用equals方法来验证哈希值相同不代表两个对象的内容相同。

    public static void main(String[] args) {

    String s1="通话";

    String s2="重地";

    System.out.println("s1="+s1.hashCode() + ":s2=" + s2.hashCode());

    System.out.println(s1.equals(s2));

    }

    执行结果:

    3713699f9fec2a064123ecf3b404071d.png

    虽然s1和s2的hashhcode值相同,但是它们的内容很显然是不一样的,equal()方法的作用是判断对象内容是否相同,结果是false,所以,两个对象的哈希值相等,并不一定能得出两个对象的值也相等。

    对此,可以得出结论:

    如果两个对象equals相等,那么这两个对象的HashCode一定也相同

    如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置,也可以理解为放在同一个桶中

    展开全文
  • Java hashcode方法

    2021-03-04 00:58:27
    Java hashcode方法?一、Hash算法原理当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。 确实提高了效率。但一个面临问题:若两个对象equals相等,但不在一...

    Java hashcode方法?

    一、Hash算法原理

    当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。

    de882b9923a223a6814416ae5e167eb7.png

    确实提高了效率。但一个面临问题:若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:

    1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。

    2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。

    package com.yuan.test;

    import java.util.HashSet;

    class hashcode

    {

    private int x;

    private int y;

    public hashcode(int x, int y)

    {

    super();

    this.x = x;

    this.y = y;

    }

    public int getX()

    {

    return x;

    }

    public void setX(int x)

    {

    this.x = x;

    }

    public int getY()

    {

    return y;

    }

    public void setY(int y)

    {

    this.y = y;

    }

    }

    public class Testhashcode

    {

    public static void main(String[] args)

    {

    HashSet hs1 = new HashSet();

    hashcode p11 = new hashcode(3, 3);

    hashcode p12 = new hashcode(3, 3);

    hashcode p13 = new hashcode(3, 5);

    hs1.add(p11);

    hs1.add(p11);

    hs1.add(p12);

    hs1.add(p13);

    System.out.println(hs1.size());

    }

    }

    输出结果:

    3

    2、重写了hashcode方法

    package com.yuan.test;

    import java.util.HashSet;

    import org.springframework.context.support.StaticApplicationContext;

    class hashcode

    {

    private int x;

    private int y;

    public hashcode(int x, int y)

    {

    super();

    this.x = x;

    this.y = y;

    }

    public int getX()

    {

    return x;

    }

    public void setX(int x)

    {

    this.x = x;

    }

    public int getY()

    {

    return y;

    }

    public void setY(int y)

    {

    this.y = y;

    }

    @Override

    public int hashCode()

    {

    final int prime = 31;

    int result = 1;

    result = prime * result + x;

    result = prime * result + y;

    return result;

    }

    @Override

    public boolean equals(Object obj)

    {

    if (this == obj) return true;

    if (obj == null) return false;

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

    hashcode other = (hashcode) obj;

    if (x != other.x) return false;

    if (y != other.y) return false;

    return true;

    }

    }

    public class Testhashcode

    {

    public static void main(String[] args)

    {

    System.out.println("before:"+hashcode.abc);

    HashSet hs1 = new HashSet();

    hashcode p11 = new hashcode(3, 3);

    hashcode p12 = new hashcode(3, 3);

    hashcode p13 = new hashcode(3, 5);

    hs1.add(p11);

    hs1.add(p11);

    hs1.add(p12);

    hs1.add(p13);

    System.out.println(hs1.size());

    }

    }

    输出结果:

    2

    p21和p22被认为是同一个对象。

    3、 没有重写hashCode的方法,但重写equals的方法

    展开全文
  • JavaHashCode的作用

    2021-02-13 00:37:48
    hashCode的常规协定是:在Java应用程序执行期间,在同一对象上多次调用hashCode方法时,必须一致地返回相同的整数,前提是对象上equals比较中所用的信息没有被修改。从某一应用程序的一次执行到...

    [plain] view

    plain copy

    hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

    hashCode 的常规协定是:

    在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

    如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

    以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现巧。)当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

    以上这段官方文档的定义,我们可以抽出成以下几个关键点:

    1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;

    2、如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;

    3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;

    4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。

    再归纳一下就是hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的。以下这段话是从别人帖子回复拷贝过来的:

    [plain] view

    plain copy

    1.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()有什么用啊

    最后,我们来看一个具体的示例吧,

    [java] view

    plain copy

    public class HashTest {

    private int i;

    public int getI() {

    return i;

    }

    public void setI(int i) {

    this.i = i;

    }

    public int hashCode() {

    return i % 10;

    }

    public final static void main(String[] args) {

    HashTest a = new HashTest();

    HashTest b = new HashTest();

    a.setI(1);

    b.setI(1);

    Set

    展开全文
  • 如何正确实现Java中的hashCode方法导语:hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,那么如何正确实现Java中的hashCode方法呢?一起来学习下吧:相等和哈希码相等是从一般的方面来讲,...
  • 浅析Java hashcode方法

    2021-08-06 14:43:08
    浅析Java hashcode方法 判断两个对象是否相等我们常用的方法就是equals方法和hashcode方法。接下来我们就来聊一聊hashcode方法是什么以及它的实现。 先上代码: @Test public void testHashCode(){ String s1 = ...
  • java中的hashcode作用

    2021-02-13 00:37:50
    根据API文档,java中的hashcode事实上是跟equals是有着密切联系的,hashcode是为了提高哈希表的性能下面的话来自JDK:hashCodepublic int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java....
  • java hashcode

    2021-03-14 17:32:45
    hashCode的常规协定是:在Java应用程序执行期间,在同一对象上多次调用hashCode方法时,必须一致地返回相同的整数,前提是对象上equals比较中所用的信息没有被修改。从某一应用程序的一次执行到同...
  • /*** Returns a hash code value for the ... This method is* supported for the benefit of hashtables such as those provided by* java.util.Hashtable.* * The general contract of hashCode is:* * Whenev...
  • 一,基本概念Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值,即hashCode值.在Java的Object类中有一个方法:public native int ...
  • Java String hashCode() 使用方法及示例Java String hashCode()方法返回字符串的哈希码。字符串hashCode()方法的语法为:string.hashCode()在这里,string是String该类的一个对象。hashCode()参数不带任何参数...
  • Java重写hashCode()方法有几个原则:1、如果两个对象使用equals()方法比较,返回true(即相等),那么两个比较对象返回的hashCode()必须相等。System.out.println(objA.equals(objB));System.out.printlin(objA....
  • hashcode方法会影响jvm性能?听上去天方夜谭,实际上蕴藏着一些微小的原理,接下来让我们走进hashcode方法,一探native方法源头。 默认实现是什么? 调用hashCode方法默认返回的值被称为identity hash code(标识...
  • Java hashCode详解

    2021-04-15 10:52:20
    hashCode方法是用来获取散列码,定义在Object类中。如果所使用的类没有重写hashCode方法的话,那么调用hashCode方法将返回该对象的存储地址。 String类使用下列算法计算散列码: //String public int hashCode() { ...
  • Java应用程序执行期间,在同一对象上多次调用hashCode方法时,必须一致地返回相同的整数,前提是对象的equals比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持...
  • java中的hashCode计算方法总结 Object.hashCode() 该方法为native修饰,没有java实现 根据对象的地址转换为整数来实现 类重写hashCode()方法 String 重写hashCode() string就是字符数组char[] string的属性 value ...
  • Java重写hashcode方法

    2021-03-10 04:56:51
    覆写hashcode1. 把某个非零常数值,例如17,保存在int变量result中;2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域):3, boolean型,计算(f? 0 : 1);4. byte,char,short型,计算(int);5. long型,计算...
  • 是比较对象的内容是否相同,并不是比较栈内存或堆内存的所在地址是否相同,在java开发中,用aaa==bbb这样比较对象是否相等是不行的,因为new出来的对象永远为false,下面是java hashCode方法的使用案例,以map集合来...
  • image搞懂 Java equals 和 hashCode 方法分析完 Java List 容器的源码后,本来想直接进入 Set 和 Map 容器的源码分析,但是对于这两种容器,内部存储元素的方式的都是以键值对相关的,而元素如何存放,便与 equals ...
  • hashCode()方法的一个主要作用就是使得对象能够成为哈希表的key或者散列集的成员。但同时这个对象还得实现equals(Object)方法,它和hashCode()的实现必须是一致的:如果a.equals(b)那么a.hashCode == b.hash...
  • 说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。 有些朋友误以为默认情况下,hashCode 返回的就是对象的存储...
  • HashCode方法

    2021-09-02 16:48:45
    文章目录1、hashCode方法介绍2、hashCode的作用3、eqauls方法和hashCode方法关系4、关于这两个方法的重要规范:5、为什么覆盖equals时总要覆盖hashCode6、总结 1、hashCode方法介绍 hashCode()方法返回的就是一个...
  • Java重写equals方法和hashCode方法 今天在学习HashSet集合时,遇到当从HashSet中插入和删除元素时,HashSet集合都要先调用hashCode方法计算元素的哈希值,然后再调用equals方法。 当向HashSet中添加元素时:每次...
  • 初涉继承,自己重写了一个.equals()方法,但是面对重写hashcode()方法时产生了疑惑,看到一个使用>>>32位移的解法,如下 public class Gps { private final double latitude; private final double longitude; ...
  • hashcode是在Object就已经定义了一个方法,名叫散列码,来看看Object是怎么描述它的/*** Returns a hash code value for the object. This method is* supported for the benefit of hash tables such as those ...
  • javahashcode方法

    2021-02-12 22:10:37
    publicclassA{Stringname="abc";A(Stringname){this.name=name;}publicA(){//TODOAuto-generatedconstructorstub}publicinthashCode(){returnname.hashCode();}publicstaticvoidmain(String[]args...
  • JAVA hashCode返回值是否就等于地址值? 我们用==进行比较对象的时候,默认对比的是对象的内存地址值。 System.out.println进行打印对象,如果对象没有重写toString的时候,默认打印的也是对象的地址值 public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 218,769
精华内容 87,507
关键字:

javahashcode方法

java 订阅