下列代码为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 ? e==null : 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 ? e==null : 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返回true)。这个问题在处理自定义类对象时尤为关键,特别...
重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...
equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法的实现是比较两个对象的内存地址是否相等。如果两个对象的内存地址相同,那么它们就是相等的。...
- 如果两个对象相等(即`equals()`返回`true`),则它们的`hashCode()`值必须相同。 - 如果两个对象不相等(即`equals()`返回`false`),它们的`hashCode()`值不一定不同,但最好尽量让它们不同,以减少哈希冲突。 ...
Java 在判断两个对象是否相同时,首先会比较它们的 hashCode 值,如果相同,那么就会比较它们的 equals 方法,如果 equals 方法也返回 true,那么这两个对象就被认为是相同的。 下面是一个简单的示例代码,演示了...
在这个例子中,`equals`方法根据`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode`方法也综合考虑了这两个属性,以确保`equals`方法返回`true`的对象具有相同的哈希码。 #### 七、总结 在Java中,...
当两个对象根据 `equals()` 方法判断相等时,它们的 `hashCode()` 方法必须返回相同的值。这是为了确保哈希表能够正确地将相等的对象映射到相同的槽位上。如果两个对象不相等,那么它们的哈希码不一定不同,但不同的...
只有当两个对象的Hashcode相同,并且equals方法返回true时,这两个对象才能被认为是相等的。 Hashcode的作用 Hashcode的主要作用是用来标识对象的身份。在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演...
这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何重写 equals 方法? ------------------------- 重写 equals 方法需要遵循以下规则: 1. 参数类型和...
首先,`equals()`方法是Java Object类中的一个方法,它的默认行为是基于对象的引用进行比较,即如果两个对象引用指向同一个内存地址,那么`equals()`返回`true`,否则返回`false`。然而,当我们在自定义类中重写`...
4. 一致性:如果两个对象的属性多次比较都相同,那么多次调用 x.equals(y) 应该始终返回相同的布尔值。 5. 非 null 性:对于任何非空引用 x,x.equals(null) 应该返回 `false`。 在重写 `equals()` 时,通常使用 `...
`equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容进行比较,通常需要在具体的类中重写`equals`方法。 #### ...
如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则可能会导致哈希表冲突,影响效率。 `equals()` 方法用于比较两个对象是否相等。在 `Object` 类中,它的默认实现是基于...
equals()函数是用于进行两个对象的比较的,是对象内容的比较,当然也能用于进行对象参照值的比较。什么是对象参照值的比较?就是两个参照变量的值的比较,我们都知道参照变量的值其实就是一个数字,这个数字可以看成...
通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个对象的散列码相同,如果它们的内容相同。 例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,...
如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...
1. **一致性**:如果两个对象相等(通过`equals`方法判断),则它们的`hashCode`值必须相同。 2. **可变性**:如果两个对象的`hashCode`值相同,并不一定意味着这两个对象相等。 ### 3. 实例分析 假设我们有一个名...
重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。
`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于生成对象的哈希值,这个值在哈希表中用来快速定位对象。 `equals()` 方法默认继承自 `Object` 类,它进行的是对象引用的比较,即如果两个对象...