关于hashCode、equals、Hashtable

来源:互联网 发布:淘宝客服人工电话400 编辑:程序博客网 时间:2024/05/19 21:04

    (1)Hashtable是java语言实现哈希表的特性的一个类,充分实现了哈希表查询效率高的优点。底层编码不知道,只知道设计的很优秀,使用时可以直接Hashtable实例.put(key,value),此外还有多种方法。详见http://www.zhuoda.org/Jason/21164.html

    (2)equals()和hashcode()这两个方法都是从object类中继承过来的。equals()在Object类中的定义是

    public boolean equals(Object obj)

  {
        return (this == obj); //==永远是比较两个对象的地址值
  }

    但是我们必需清楚,当String 、Math、还有Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法,也就是说是进行内容的比较。

    (3)hashcode() 方法,在object类中定义如下:
    public native int hashCode(); <完>
    说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、 Double等等这些类都是覆盖了hashcode()方法的。

    也就是说,hashcode()是用来得到实例的哈希码值,equals()是用来判断两个对象内容是否相同或者是否就是同一个对象。

    比如java的集合类Set中不允许有重复的元素,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

    所以,Java对于eqauls方法和hashCode方法是这样规定的:1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同     上面说的对象相同指的是用eqauls方法比较,即内容相同。

引用自http://edu.codepub.com/2009/1005/16144_2.php