`
xinglongbing
  • 浏览: 151136 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

equals方法返回true的两个对象,其hashCode方法返回相同的值

JDK 
阅读更多
下列代码为JDK API中HashMap的一部分,
static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;  // the next Entry object
        final int hash;  //散列值

        /**
         * Creates new entry.
         */
        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }

        public final K getKey() {
            return key;
        }

        public final V getValue() {
            return value;
        }

        public final V setValue(V newValue) {
	    V oldValue = value;
            value = newValue;
            return oldValue;
        }

        public final boolean equals(Object o) {  
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry e = (Map.Entry)o;
            Object k1 = getKey();
            Object k2 = e.getKey();
            if (k1 == k2 || (k1 != null && k1.equals(k2))) {  // 同一个Key对象或者该Key对象的equals方法为真
                Object v1 = getValue();    
                Object v2 = e.getValue();
                if (v1 == v2 || (v1 != null && v1.equals(v2))) //同一个Value对象或Value对象的equals方法为真
                    return true;
            }
            return false;
        }

        public final int hashCode() {  
            return (key==null   ? 0 : key.hashCode()) ^
                   (value==null ? 0 : value.hashCode());
        }

        public final String toString() {
            return getKey() + "=" + getValue();
        }

        /**
         * This method is invoked whenever the value in an entry is
         * overwritten by an invocation of put(k,v) for a key k that's already
         * in the HashMap.
         */
        void recordAccess(HashMap<K,V> m) {
        }

        /**
         * This method is invoked whenever the entry is
         * removed from the table.
         */
        void recordRemoval(HashMap<K,V> m) {
        }
    }
/**
     * Returns the value to which the specified key is mapped,
     * or {@code null} if this map contains no mapping for the key.
     *
     * <p>More formally, if this map contains a mapping from a key
     * {@code k} to a value {@code v} such that {@code (key==null ? k==null :
     * key.equals(k))}, then this method returns {@code v}; otherwise
     * it returns {@code null}.  (There can be at most one such mapping.)
     *
     * <p>A return value of {@code null} does not <i>necessarily</i>
     * indicate that the map contains no mapping for the key; it's also
     * possible that the map explicitly maps the key to {@code null}.
     * The {@link #containsKey containsKey} operation may be used to
     * distinguish these two cases.
     *
     * @see #put(Object, Object)
     */
    public V get(Object key) {  //从HashMap中查找关键字key对应的value对象
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;        //具有相同的散列值且是同一个key对象或key对象的equals方法返回true
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }
/**
     * Applies a supplemental hash function to a given hashCode, which
     * defends against poor quality hash functions.  This is critical
     * because HashMap uses power-of-two length hash tables, that
     * otherwise encounter collisions for hashCodes that do not differ
     * in lower bits. Note: Null keys always map to hash 0, thus index 0.
     */
    static int hash(int h) { //散列函数
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
/**
     * Returns <tt>true</tt> if this set contains the specified element.
     * More formally, returns <tt>true</tt> if and only if this set
     * contains an element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
     *
     * @param o element whose presence in this set is to be tested
     * @return <tt>true</tt> if this set contains the specified element
     */
    public boolean contains(Object o) {
 return map.containsKey(o);
    }
final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

 

 

HashSet:

/**
     * Returns <tt>true</tt> if this set contains the specified element.
     * More formally, returns <tt>true</tt> if and only if this set
     * contains an element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
     *
     * @param o element whose presence in this set is to be tested
     * @return <tt>true</tt> if this set contains the specified element
     */
    public boolean contains(Object o) {
 return map.containsKey(o);
    }

分享到:
评论

相关推荐

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

    标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个对象可能具有相同的哈希码(hashCode),但并不意味着它们相等(equals返回true)。这个问题在处理自定义类对象时尤为关键,特别...

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

    重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...

    equals与hashCode方法讲解

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

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

    - 如果两个对象相等(即`equals()`返回`true`),则它们的`hashCode()`值必须相同。 - 如果两个对象不相等(即`equals()`返回`false`),它们的`hashCode()`值不一定不同,但最好尽量让它们不同,以减少哈希冲突。 ...

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

    Java 在判断两个对象是否相同时,首先会比较它们的 hashCode 值,如果相同,那么就会比较它们的 equals 方法,如果 equals 方法也返回 true,那么这两个对象就被认为是相同的。 下面是一个简单的示例代码,演示了...

    set接口经常用的hashCode和equals方法详解

    在这个例子中,`equals`方法根据`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode`方法也综合考虑了这两个属性,以确保`equals`方法返回`true`的对象具有相同的哈希码。 #### 七、总结 在Java中,...

    Java_重写equals()和hashCode()

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

    java中Hashcode的作用.docx

    只有当两个对象的Hashcode相同,并且equals方法返回true时,这两个对象才能被认为是相等的。 Hashcode的作用 Hashcode的主要作用是用来标识对象的身份。在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演...

    重写equals方法

    这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何重写 equals 方法? ------------------------- 重写 equals 方法需要遵循以下规则: 1. 参数类型和...

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

    首先,`equals()`方法是Java Object类中的一个方法,它的默认行为是基于对象的引用进行比较,即如果两个对象引用指向同一个内存地址,那么`equals()`返回`true`,否则返回`false`。然而,当我们在自定义类中重写`...

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

    4. 一致性:如果两个对象的属性多次比较都相同,那么多次调用 x.equals(y) 应该始终返回相同的布尔值。 5. 非 null 性:对于任何非空引用 x,x.equals(null) 应该返回 `false`。 在重写 `equals()` 时,通常使用 `...

    equals方法的重写.docx

    `equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容进行比较,通常需要在具体的类中重写`equals`方法。 #### ...

    hashcode()和equals()

    如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则可能会导致哈希表冲突,影响效率。 `equals()` 方法用于比较两个对象是否相等。在 `Object` 类中,它的默认实现是基于...

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

    equals()函数是用于进行两个对象的比较的,是对象内容的比较,当然也能用于进行对象参照值的比较。什么是对象参照值的比较?就是两个参照变量的值的比较,我们都知道参照变量的值其实就是一个数字,这个数字可以看成...

    Java中equals,hashcode和==的区别

    通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个对象的散列码相同,如果它们的内容相同。 例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,...

    Java中的equals和hashCode方法详解1

    如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...

    hashcode和equals的分析

    1. **一致性**:如果两个对象相等(通过`equals`方法判断),则它们的`hashCode`值必须相同。 2. **可变性**:如果两个对象的`hashCode`值相同,并不一定意味着这两个对象相等。 ### 3. 实例分析 假设我们有一个名...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。

    java 基础之(equals hashcode)

    `equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于生成对象的哈希值,这个值在哈希表中用来快速定位对象。 `equals()` 方法默认继承自 `Object` 类,它进行的是对象引用的比较,即如果两个对象...

Global site tag (gtag.js) - Google Analytics