//根据value查找key
public K getKeyByValue(V val)
{
for(K key:keySet())
{
if(get(key).equals(val) && get(key) == val) (1)
{
return key;
}
}
return null;
}
重写HashMap的put方法,该方法不允许value重复
public V put(K key,V value)
{
for(V val:valueSet())
{
if(val.equals(value) && val.hashCode()==value.hashCode()) (2)
{
throw new RuntimeException("MyMap实例中不允许有重复value!");
}
}
return super.put(key, value);
}
(1)处的get(key) == val不包括前面的get(key).equals(val)吗?为什么两个都要写呢?
(2)处的哪位能解释下意思吗?对HashCode的相等和“==”号以及equals分辨不清楚各自的用处。
谢谢!~~~
public K getKeyByValue(V val)
{
for(K key:keySet())
{
if(get(key).equals(val) && get(key) == val) (1)
{
return key;
}
}
return null;
}
重写HashMap的put方法,该方法不允许value重复
public V put(K key,V value)
{
for(V val:valueSet())
{
if(val.equals(value) && val.hashCode()==value.hashCode()) (2)
{
throw new RuntimeException("MyMap实例中不允许有重复value!");
}
}
return super.put(key, value);
}
(1)处的get(key) == val不包括前面的get(key).equals(val)吗?为什么两个都要写呢?
(2)处的哪位能解释下意思吗?对HashCode的相等和“==”号以及equals分辨不清楚各自的用处。
谢谢!~~~
http://blog.csdn.net/KindAzrael/archive/2009/10/05/4633615.aspx
if(get(key).equals(val) && get(key) == val) (1)
{
return key;
}
// 这是哪儿的代码
if(get(key).equals(val) && get(key) == val)
{
return key;
} equals表示两个数值相等就可以,地址可以不相等,==表示数值和地址都要相等.
==表示数值和地址都要相等.
如果a.equals(b),那么a.hashcode==b.hashcode
反过来则不行.a.hashcode==b.hashcode,不一定a.equals(b)
hashcode是散列码
在遍历HashMap的时候,最好是判空一下,因为它的键或值可以为null,Hashtable就没有这样的问题。
Iterator it = map.entrySet().iterator();
while(it.hasNext())
{
Entry entry = (Entry) it.next();
System.out.println(entry.getKey()+","+entry.getValue());
}