`
核桃博客
  • 浏览: 10400 次
  • 来自: hetaoblog
文章分类
社区版块
存档分类
最新评论

说一说java里面的hashcode–Object.hashcode()

 
阅读更多
http://www.hetaoblog.com/%E8%AF%B4%E4%B8%80%E8%AF%B4java%E9%87%8C%E9%9D%A2%E7%9A%84hashcode-object-hashcode/
java里面Object这个类的方法里面,一个重要的方法是hashcode(), 下面是javadoc
public int hashCode()
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.
The general contract of hashCode is:

Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

Returns:
a hash code value for this object.

这段话说了关于hashcode()这个函数的几个意思:
1. 用在Hashtable这个类, 其实其他还有HashMap, HashSet, ConcurrentHashMap等类上,一般类名里面有Hash字样的集合类,基本都要用到hashcode()这个函数
2. 同一个对象,如果用来在equals判断的属性未发生改变,那么在同一个进程里面hashcode()函数的多次调用,始终应该返回同一个整数
3. 如果两个对象用equals方法判断为相同,那么hashcode()也应该返回同样的值; 否则hashtable/hashmap这些类就不能正常工作了
4. 如果两个对象用equals方法判断为不同,hashcode可以一样, 就是所谓的hashcode()冲突; 虽然hashcode()可能冲突,但是冲突会使得hashtable()/hashmap()效率下降,我们在自己重写hashcode()函数的时候需要尽可能的让冲突减少; 事实上,很多情况下hashcode()的冲突是难以避免的;
5. jdk的javadoc说’As much as is reasonably practical’, Object.hashcode()会返回不同的值, 通常是返回对象的内存地址;
但是实际上,我在hotspot jdk 1.6.30/winxp下面测试,发现并没有返回对象的地址,并且的确是有冲突的,下面是测试代码和运行结果,


   for(int i = 0; i < 10000; ++i)
        {
            Object o = new Object();
            os.add(o);
            Integer h = o.hashCode();

            if((i == 361) || (i == 1886) || (i == 2185) || (i == 1905))
            {
                System.out.println("i,hashcode(): " + i + "," + h);
            }

            if(s.contains(h))
            {
                System.out.println("conflict:" + i + ", " + m.get(h));
            }
            else
            {
                s.add(h);  
                m.put(h,  i);
            }

        }

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

        int c = 0;
        for(Object o: os)
        {
            c++;
        }

        System.out.println(c);
    }



我运行了两次,结果分别是
i,hashcode(): 361,9578500
i,hashcode(): 1886,9578500
conflict:1886, 361
i,hashcode(): 1905,14850080
i,hashcode(): 2185,14850080
conflict:2185, 1905
9998


i,hashcode(): 361,5462872
i,hashcode(): 1886,29705835
conflict:1887, 362
i,hashcode(): 1905,9949222
i,hashcode(): 2185,2081190
conflict:2186, 1906
9998
10000

说明:
1. 代码最后的 for(Object o: os)里面对count统计出10000,表示所有对象都没有被回收,也就不可能存在同一个地址被两次分配空间的情况
2. 在这个10000的循环中,每次都有两组对象发生冲突,说明在这个版本的jdk里面,Object.hashcode()肯定没有返回对象的地址;
2. 在这个10000的循环中,每次都有两组对象发生冲突,说明在这个版本的jdk里
分享到:
评论

相关推荐

    java中Hashcode的作用.docx

    Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何产生的?有什么作用?下面...

    java中hashcode()和equals()的详解

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

    java中hashcode和equals的详解.pdf

    hashCode 方法是 Java 中 Object 类的一个方法,用于返回对象的哈希码值。这个方法的作用是将对象转换为一个整数值,以便于快速地比较和查找对象。在 Java 中,每个对象都有一个独特的哈希码值,这个值可以用来标识...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    java源码阅读之java.lang.Object

    Java源码阅读之java.lang.Object Java中的Object类是所有类的父类,任何类都默认继承Object。Object类提供了多种方法,以下是其中一些重要的方法: 1. clone方法:保护方法,实现对象的浅复制,只有实现了...

    java中hashcode()和equals()的详解.docx

    在Java编程语言中,`hashCode()`与`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及在Java集合框架...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    `hashCode` 方法是 `Object` 类中的一个方法,用于返回对象的哈希码值。在 Java 中,哈希码经常被用于实现散列表(如 `HashMap` 和 `HashSet`)。为了确保散列表的正确性,重写 `equals` 方法时,通常也需要重写 `...

    java中hashcode()和equals()方法详解

    在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...

    如何正确实现Java中的HashCode共6页.pdf.z

    在Java编程语言中,`hashCode()`方法是每个对象都继承自`Object`类的一个关键方法。这个方法的主要目的是为对象生成一个整数哈希码,通常用于存储和检索对象时提高性能,特别是在使用哈希表(如`HashMap`、`HashSet`...

    深入理解Java中HashCode方法

    在Java的所有类中,Object类是最顶层的父类,它定义了hashCode方法,该方法返回对象的hashCode值。hashCode方法的实现方式有多种,String类的hashCode方法就是一个典型的例子,它使用数学表达式s[0]*31^(n-1) + s[1]...

    Java Object类认识

    总结来说,理解`Object`类及其提供的方法是Java开发的基础。`equals()`方法和`==`操作符在比较对象时有不同的语义,根据具体需求选择合适的方式。在编写自定义类时,正确地重写这些方法对于实现预期的行为至关重要。

    Java中hashCode的作用

    以下是关于HashCode的官方文档定义:  hashcode方法返回该对象的哈希码值。...  如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相

    HashCode的用法详解

    在 Java 中,hashCode 是 Object 类中的一个方法,默认情况下,该方法会将对象的内部地址转换成一个整数。然而,在实际应用中,我们需要重新定义 hashCode 方法,以便满足我们的需求。 例如,我们可以将对象的某个...

    解析Java对象的equals()和hashCode()的使用

    hashCode()函数返回的是一个用来进行赫希操作的整型代号,请不要把这个代号和前面所说的参照变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找对象的位置的功能。hashCode()所返回的值是用来分类对象...

    Java 中HashCode作用_动力节点Java学院整理

    HashCode 在 Java 中扮演着非常重要的角色,它对于一个对象的重要性不言而喻。本文将详细介绍 HashCode 的作用和重要性,为读者提供一个深入了解 HashCode 的机会。 HashCode 的作用 在 Java 中,HashSet、...

Global site tag (gtag.js) - Google Analytics