请告诉我HashMap的函数containsKey(),它是如何在内部工作的。是否使用equals或hashcode函数来匹配密钥。我将string密钥用于hashmap,当我动态使用该密钥时,containskey将返回false。例如(只是一个示例代码,而不是我在应用程序中使用的原始代码)
class employee {
employee(String name) {
return name;
}
}
class test {
HashMap hm = new HashMap();
hm.put("key1",new Employee("emp1"));
hm.put("key2",new Employee("emp2"));
hm.put("key3","emp4");
hm.put("new Employee("emp5")","emp4");
System.out.println(hm.containsKey("emp5"));
}发布于 2014-07-17 14:34:46
关键字是一个Employee对象,而不是字符串,在containsKey中有一个字符串。该比较将返回false,因为字符串"emp5“不等于对象Employee。
以下是containsKey文档中的一句话:
如果此映射包含指定键的映射,则
返回true。更正式地说,当且仅当此映射包含键k的映射时才返回true,使得(key==null?k==null : key.equals(k))
因为在你的例子中key是一个字符串,只有当k也是一个字符串并且它的内容与key相同时,'equals‘才会返回'true’。
发布于 2014-07-17 14:57:47
您的代码有许多错误,这是无效的hm.put("new Employee("emp5")","emp4");
在集合中也使用泛型类型
HashMap<String,employee> hm = new HashMap<String,employee>();并将你的类命名为Employee而不是employee,类名以大写开头。此外,您调用的是new Employee,而您的类名是employee。
根据hashMap的source。它在内部调用键上的equals() (在本例中,这意味着String的equals )
public boolean containsKey(Object key)
{
int idx = hash(key);
HashEntry<K, V> e = buckets[idx];
while (e != null)
{
if (equals(key, e.key))
return true;
e = e.next;
}
return false;
}你的有效代码(假设你没有尝试实现一些不寻常的东西)应该是这样的:
class Employee {
String name;
Employee(String name) {
this.name = name;
}
}
class Test {
public void hello() {
HashMap<String,Employee> hm = new HashMap<String,Employee>();
hm.put("key1", new Employee("emp1"));
hm.put("key2", new Employee("emp2"));
hm.put("key3", new Employee("emp4"));
hm.put("key4", new Employee("emp5"));
System.out.println(hm.containsKey("key4"));
}
}发布于 2014-07-17 14:41:03
已更正的代码:
HashMap hm= new HashMap();
hm.put("key1",new Employee("emp1"));
hm.put("key2",new Employee("emp2"));
hm.put("key3","emp4");
System.out.println(hm.containsKey("key1"));这将返回true。
您正在根据字符串键保存Employee对象。所以你需要检查有效的密钥。在您的示例中,在向哈希图添加元素时,emp5不被用作键。
对于你的第二个问题:它首先在内部检查密钥的哈希码。如果hashcode相同,它将检查equals方法。
https://stackoverflow.com/questions/24796299
复制相似问题