import java.util.*;
class Dog {
public Dog(String n) { name = n; }
public String name;
public boolean equals(Object o) {
if((o instanceof Dog) &&
(((Dog)o).name == name)) {
return true;
} else {
return false;
}
}
public int hashCode() {return name.length(); }
}
class Cat { }
enum Pets {DOG, CAT, HORSE }
class MapTest {
public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
m.put("k1", new Dog("aiko")); // add some key/value pairs
m.put("k2", Pets.DOG);
m.put(Pets.CAT, "CAT key");
Dog d1 = new Dog("clover"); // let's keep this reference
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");
System.out.println(m.get("k1")); // #1
String k2 = "k2";
System.out.println(m.get(k2)); // #2
Pets p = Pets.CAT;
System.out.println(m.get(p)); // #3
System.out.println(m.get(d1)); // #4
System.out.println(m.get(new Cat())); // #5
System.out.println(m.size()); // #6
}
}
which produces something like this:
Dog@1c
DOG
CAT key
Dog key
null
5
Let's review the output. The first value retrieved is a Dog object (your value
will vary). The second value retrieved is an enum value (DOG). The third value
retrieved is a String; note that the key was an enum value. Pop quiz: What's the
implication of the fact that we were able to successfully use an enum as a key?
The implication of this is that enums override equals() and hashCode(). And,
if you look at the java.lang.Enum class in the API, you will see that, in fact, these
methods have been overridden.
The fourth output is a String. The important point about this output is that the
key used to retrieve the String was made of a Dog object. The fifth output is null.
The important point here is that the get() method failed to find the Cat object
that was inserted earlier. (The last line of output confirms that indeed, 5 key/value
pairs exist in the Map.) Why didn't we find the Cat key String? Why did it work to
use an instance of Dog as a key, when using an instance of Cat as a key failed?
It's easy to see that Dog overrode equals() and hashCode() while Cat didn't.
Let's take a quick look at hashcodes. We used an incredibly simplistic hashcode
formula in the Dog class—the hashcode of a Dog object is the length of the
instance's name. So in this example the hashcode = 6. Let's compare the following
two hashCode() methods:
public int hashCode() {return name.length(); } // #1
public int hashCode() {return 4; } // #2
Time for another pop quiz: Are the preceding two hashcodes legal? Will they
successfully retrieve objects from a Map? Which will be faster?
The answer to the first two questions is Yes and Yes. Neither of these hashcodes
will be very efficient (in fact they would both be incredibly inefficient), but they
are both legal, and they will both work. The answer to the last question is that the
first hashcode will be a little bit faster than the second hashcode. In general, the
more unique hashcodes a formula creates, the faster the retrieval will be. The first
hashcode formula will generate a different code for each name length (for instance
the name Robert will generate one hashcode and the name Benchley will generate
a different hashcode). The second hashcode formula will always produce the same
result, 4, so it will be slower than the first.
分享到:
相关推荐
哈希表,也被称为Hash Map,是计算机科学中一种高效的数据结构,用于存储键值对。它通过一种称为哈希函数的过程将键映射到数组的特定位置,从而实现快速的查找、插入和删除操作。在哈希表中,查找时间通常接近常数...
哈希映射(Hash Map),又称为哈希表,是一种数据结构,用于高效地存储和检索键值对。它基于哈希表的概念,利用哈希函数将键(Key)映射到一个固定大小的数组(桶)中的特定位置,以此实现快速访问。哈希表最大的...
在IT领域,哈希表(Hash Map)是一种高效的数据结构,尤其在处理大数据时,它的作用至关重要。"pwwHash.zip_Big!_hash map"这个文件标题暗示了这是一个关于大规模数据处理和哈希映射的专题,可能包含了某种特定的...
哈希表(Hash Map)是一种在编程中广泛使用的数据结构,它通过散列函数将键(Key)映射到一个数组的索引位置,从而实现快速查找、插入和删除操作。在C语言中,虽然没有内置的哈希表类型,但我们可以自定义一个哈希表...
Linked Hash Map Example java 源码
标题中的“Hash Map for geeks_hashmap_Geeks_源码”显然指的是一个关于哈希映射(HashMap)的学习资源,特别针对极客和普通程序员。哈希映射是一种数据结构,它允许我们以O(1)的时间复杂度进行插入、删除和查找操作...
哈希映射(Hash Map)是一种常见的数据结构,它提供了键值对(Key-Value Pair)的快速存储和检索功能。在C++中,STL(Standard Template Library)提供了一个名为`std::unordered_map`的容器,它是基于哈希表实现的...
**Cuckoo Hash Map 开源实现** Cuckoo Hash Map 是一种高效的散列数据结构,它的设计灵感来源于布谷鸟的繁殖习性。在自然界,布谷鸟会将自己的蛋产在其他鸟类的巢中,利用这种策略来分散风险。在计算机科学中,布谷...
此外,使用裸对象时,`'toString' in map`将返回`false`,这意味着我们可以安全地使用任何字符串作为键,而不用担心与内置方法冲突。 在遍历HashMap时,`for...in`循环也会更简单,只需确保仅处理对象自身的属性: ...
hash_map
JavaScript中的Hash Map是一种数据结构,用于高效地存储和检索键值对。虽然JavaScript的内置对象`Object`可以用来模拟简单的键值对存储,但它并非一个真正的哈希映射,因为`Object`的一些特性可能导致意料之外的行为...
### hash_map详解 #### 0. 为什么需要hash_map? 在软件开发中,经常会遇到需要高效存储和查找键值对(key-value)的情况。例如,在管理人物名称及其相关信息时,我们希望能够快速地添加、查找和更新数据。传统的...
《C++ Sparse Map:高效的哈希映射与集合实现解析》 在计算机科学中,数据结构的选择对于程序的性能有着至关重要的影响。特别是在C++这样的系统级编程语言中,高效的数据结构更是程序员们的得力助手。本文将深入...
在使用hash_map的时候,发现他对字符串的支持不是很好,就特写了一个str hash map 的程序,设置和提取键值的性能是hash_map 的20 倍左右。 特意拿出来给大家分享,如果有改进的, 请大家指出。
jg :: dense_hash_map 一个简单的std::unordered_map替代品,具有更好的性能,但失去了稳定的寻址方式,这是一种折衷方案。 在此处查看此哈希图的详细说明: : 生成状态: 特拉维斯(Travis):
Linux下的`hash_map`是一种基于哈希表的数据结构,它提供了高效的键值对存储功能。与`map`不同,`hash_map`不使用二叉查找树(如红黑树),而是利用哈希函数来实现快速查找。哈希表通常由数组和散列函数组成,数组的...
代码重点是hash_table,附加std::map与其做对比,实现的是一条sql语句:select c_nationkey, c_mktsegment, count(*), max(c_acctbal) from aaa_customer_1g group by c_nationkey, c_mktsegment order by c_...
在IT领域,哈希表(Hash Map)是一种广泛使用的数据结构,它提供了快速的插入、删除和查找操作。HashMap在Java编程语言中的实现是`java.util.HashMap`类,它是基于哈希表原理来工作的。标题"HashMap-master.zip_hash...
C++中的`hash_map`虽然未被正式纳入标准模板库(STL),但在很多STL实现中都有提供。`hash_map`的优势在于其近乎常数时间的平均复杂度,这得益于它对内存的高效利用,即使在大量数据面前,也能保持高效性能。 `map`是...