0 0

hashmap 判断键的相等依据是什么?equals()?hashcode()?==?5

package collection;
  
import java.util.HashMap; 
import java.util.Map; 
 
public class Test2 { 
  
     /**
      * @param args
      */ 
     public static void main(String[] args) { 
         // TODO Auto-generated method stub 
         Map map=new HashMap(); 
         map.put(new PhoneNumber(020,1234567),"xx"); 
         System.out.println(map.get(new PhoneNumber(020,1234567))); 
    } 
  
     private static class PhoneNumber{ 
         /**
          * @param areaCode
          * @param extension
          */ 
         public PhoneNumber(int areaCode, int extension) { 
             this.areaCode =(short) areaCode; 
             this.extension = (short)extension; 
         } 
  
         private short areaCode; 
         private short extension; 
          
         public boolean equals(Object o){ 
       
             if(o==this){ 
                 return true; 
             } 
             if(!(o instanceof PhoneNumber)){ 
                 return false; 
             } 
         PhoneNumber pn=(PhoneNumber)o; 
         return pn.extension==extension && pn.areaCode==areaCode; 
         } 
         //result就是我们得到的散列值,,计算过程有多种,这里只是个例子 
         public int hashCode(){ 
             int result=17; 
             result=37*result+areaCode; 
             result=37*result+extension; 
             return result; 
         } 
          
     } 
      
} //结果是xx,就是查处了这个对象
======================================================================
======================================================================
======================================================================

上述的这段代码中,判断hashmap的键相等,使用了equals方法,但是equals方法又重写了,使用的是==判断。
我的问题是
1----hashcode()方法在hashmap中哪里有调用?或者用处是什么???
2----  "=="是判断栈中的引用是不是指向同一个堆中的对象,但map.get方法中是new了一个键值对象,就是说,指向的不是同一个键值对象,结果居然查到了,就是说,它们指向同一个对象!!!为什么??????
3----是不是所有hash有关的类,要比较相等,都要重写hashcode方法???
4----总结下我的问题,其实就是hashmap中   equals()   hashcode()   ==  这三者用处各是什么,哪里用的到?????????
OO 
2011年1月18日 00:07

1个答案 按时间排序 按投票排序

0 0

采纳的答案

回答如下
1.hashcode这个方法是用来鉴定2个对象是否相等的,在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。举个例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
2.你 new 出来的PhoneNumber对象是做为map的key 根据上面的1可以得到你获取的就是刚刚保存的key的值 这仅仅是在map对象中 ,实际中他们是不同的对象
3.根据1,可以自己判断
4.==号是值的比较 对于原始类型就是值的比较,对于引用类型就是引用地址的直接比较,‘==’在map中 没啥用 map只会调用equals方法比较

2011年1月18日 00:56

相关推荐

    Java_重写equals()和hashCode()

    当两个对象根据 `equals()` 方法判断相等时,它们的 `hashCode()` 方法必须返回相同的值。这是为了确保哈希表能够正确地将相等的对象映射到相同的槽位上。如果两个对象不相等,那么它们的哈希码不一定不同,但不同的...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    例如,在HashMap中,如果两个键通过 `equals()` 方法判断为相等,但它们的哈希码不同,那么HashMap会将它们视为不同的键,从而可能导致错误的结果。 **4. 注意事项** - 当重写 `equals()` 时,总是应该同时重写 `...

    equals与hashCode方法讲解

    equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法的实现是比较两个对象的内存地址是否相等。如果两个对象的内存地址相同,那么它们就是相等的。...

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

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

    Java中的equals()和hashCode()契约Ja

    然而,在实际开发中,我们往往需要根据对象的内容来判断它们是否相等,因此,我们需要重写`equals()`方法,确保它基于对象的属性进行比较。 `hashCode()`方法则返回一个整数,这个整数通常代表对象的内存地址的某种...

    超详细_解释java_equals()与hashCode().pdf

    `equals()`方法用于判断两个对象是否相等,而`hashCode()`方法则与对象在哈希表中的存储位置相关。 1. `equals()`方法: - 默认情况下,`equals()`方法会比较两个对象的引用是否指向同一块内存空间,即检查它们...

    equals,hashcode,toString

    当两个对象通过`equals()`方法判断为相等时,它们的`hashCode()`方法返回值也应该相等。反之,如果两个对象不相等,它们的哈希码应该尽可能不同,以减少哈希冲突的概率。因此,重写`equals()`时,通常也需要重写`...

    Java常见笔试、面试题目深度剖析 相等性(==及equals方法)详解

    通常,重写equals()的同时也应重写hashCode(),以保持两个方法的一致性,因为它们经常一起用于数据结构(如HashMap)中的键值比较。 此外,还需要注意null值的情况。当使用“==”比较时,两个null值会被认为是相等...

    hashcode()和equals()

    当两个对象相等时(根据 `equals()` 方法判断),它们的 `hashCode()` 值也应当相等,这是为了保证哈希表的正确工作。如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则...

    HashCode的用法详解

    * 在 HashMap 中,hashCode 用于确定键的存储地址。 * 在排序算法中,hashCode 用于快速定位到目标对象。 equals() 和 hashCode() 的关系 equals() 和 hashCode() 是两个相关的概念。equals() 用于判断两个对象...

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

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

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

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

    在这个例子中,`equals()`方法基于`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode()`方法也考虑到了这两个属性,以确保当两个对象相等时,它们的哈希码也相同。 #### 总结 `hashCode()`和`equals()...

    java中为何重写equals时必须重写hashCode方法详解

    如果两个对象通过 `equals()` 判断为相等,但它们的 `hashCode()` 不同,哈希表可能会将它们存放在不同的位置,导致查找效率下降。因此,重写 `equals()` 时,需要确保相等的对象有相同的哈希码。 3. **性能优化**...

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

    如果在该位置上已经有其他对象,HashMap会使用`equals()`方法来检查新插入的键是否与已存在的键相等。如果相等,则更新值;如果不等,则会尝试在下一个可用的槽位插入。这称为开放寻址或链地址法,具体取决于HashMap...

    java中Hashcode的作用.docx

    3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。 Hashcode和equals方法的关系 Hashcode和...

    Java equals 方法与hashcode 方法的深入解析.rar

    根据`hashCode()`的约定,如果两个对象通过`equals()`方法判断相等,那么它们的哈希码必须相同。反之,如果两个对象的哈希码不同,它们在哈希表中通常被视为不相等,但哈希码相同并不意味着对象一定相等,因为不同的...

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

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

Global site tag (gtag.js) - Google Analytics