zoukankan      html  css  js  c++  java
  • Java_Objects_hashCode

    equals测试:

    1:查看源码发现,继承Object中的equals方法时,比较的是两个引用是否指向同一个对象

    2:子类可以通过重写equals方法的形式,改变比较内容(比如String 中的equals方法)

    哈希码

    在Java中,哈希码代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其哈希码相等,则这两个字符串是相等的。其次,哈希码是一种数据结构的算法。常见的哈希码的算法有:

    1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

    2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
    3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

    public boolean equals(Object obj) {
      return (this == obj);
    }

    java 中对象的哈希码值是指的什么?

    就是对象在JVM虚拟出来的内存地址。不是实际物理内存地址。

    http://bbs.itheima.com/forum.php?mod=viewthread&tid=55162
    哈希码值和对象的内存地址值有何关系?
    
    class Test
    {
            public int hashCode()
           {
                 return 60;
           }
      
    }
    class Demo
    {
            public static void main(String[] args)
           {
                  Test t1 = new Test();
                  Test t2 = new Test();
                  System.out.println("t1="+t1+"...t2="+t2);
                  System.out.println(t1==t2);
            }
    }
    打印出来的结果是:
    t1=Test@3c...t2=Test@3c
    false
    这是什么意思?我以为t1和t2的哈希码值相同,也就代表它们在内存中的地址值相同,所以它们是同一个对象,但t1==t2结果却是false,这样看来这俩对象在内存中的地址值是不一样的,那么
    1.它们的地址值又是什么?
    2.它们的地址值和它们的哈希码值有何关系?  
    3.Object 类中的equals比较的是否就是两个对象的地址值?

    哈希值和内存地址 可能有一定的联系 但是没有必然的联系啊 这个涉及到计算机系统中的存储形式,如果是哈希存储形式  那么 这存储地址会根据哈希值 再有一些规则算出存储地址   如果哈希值相同 还会有解决哈希值冲突的机制   如果有兴趣的话  可以去对该知识点的研究一下   欢迎分享 研究成果!!

    嗯嗯,刘大版主说的很有道理,我刚刚去搜索了一下,对这几个问题有点点稍深入的了解了:
    1.对象的哈希码值和内存地址值不是一回事;
    2.如果自定义类不复写hashCode方法,那么该方法返回的哈希码值,应该就是对象的内存地址值,如果复写了hashCode方法,那么此时对象的哈希码值就不是它的内存地址值了;
    3.如果自定义类不复写Object类中的equals方法,那么equals比较的就是两个对象的内存地址值。
    对哈希码值和内存地址值有点明了了,

    看Object类中的hashcode的源码 public native int hashCode(); 知道这是一本地方法,也就是说当new一个对象的时候,都会有一个hash码,计算hash码用到相应的hash算法,我个人认为之所以hashcode()方法是一个本地方法,是应为java中的对象的hash码的得出是通过本地系统提供的hash算法(个人理解,有误请指正),还有java中 对象的hashcode并不是指对象的物理地址。你复写hashcode方法后,就是说对象的hashcode是按你写的方法来计算而已,在楼主的程序中你是new了两个对象,所以内存地址肯定是不一样的,但是在你定义的类中复写里hashcode方法,而且是返回一个确定的值,所以他们hash码肯定是一致的。

    public final class System extends Object

    public static int identityHashCode​(Object x)
    Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
    Parameters:
    x - object for which the hashCode is to be calculated
    Returns:
    the hashCode
    Since:
    1.1
    See Also:
    Object.hashCode()Objects.hashCode(Object)
  • 相关阅读:
    第六章 实验报告(函数与宏定义)
    第三次实验报告
    第五章 循环结构课后反思
    第二次实验报告
    第一次实验报告
    第一次作业
    第九章 结构体与共用体
    第八章 指针实验
    第7章 数组实验
    第六章 函数和宏定义实验(2)
  • 原文地址:https://www.cnblogs.com/haizinihao/p/14715816.html
Copyright © 2011-2022 走看看