//根据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分辨不清楚各自的用处。
谢谢!~~~

解决方案 »

  1.   

    hashCode与equals()规则可以看看我的博客 呵呵有点广告嫌疑
    http://blog.csdn.net/KindAzrael/archive/2009/10/05/4633615.aspx
    if(get(key).equals(val) && get(key) == val)    (1) 

          return key; 

    // 这是哪儿的代码
      

  2.   


    if(get(key).equals(val) && get(key) == val)

          return key; 
    } equals表示两个数值相等就可以,地址可以不相等,==表示数值和地址都要相等.
      

  3.   

    equals表示两个数值相等就可以,地址可以不相等,
    ==表示数值和地址都要相等.
    如果a.equals(b),那么a.hashcode==b.hashcode
    反过来则不行.a.hashcode==b.hashcode,不一定a.equals(b)
    hashcode是散列码
      

  4.   

    equals 本身是object类里的一个方法,他原本是比较地址是否相等的,也就是判断两个对象是否是同一个对象,但是String类重写了该方法,让该方法只判断值相等就可以了。其实你也可以写一个类自己重写这个方法的。
      

  5.   

    equals是Object里面的方法,是比较两个对象的地址是否相等,如果重写了equals方法,那么判断规则是根据你重写的规则来的,一般equals判断相等的对象,它们的hashCode值也相等,反过来就不一定了,而==是比较地址值是否相等(其实地址相等就意味着值也相等),一般==只用于基本类型和相同类型的包装类的比较,在对象比较中有一个特殊的可以用==,那就是对象和null进行相等比较。
    在遍历HashMap的时候,最好是判空一下,因为它的键或值可以为null,Hashtable就没有这样的问题。
      

  6.   

    还有一点值得一提的是:HashMap中的匿名内部类很好用的,可以使用entrySet()访问到它的Entry这个方法遍历,比那个keySet效率要高很多。
    Iterator it = map.entrySet().iterator();
    while(it.hasNext())
    {
      Entry entry = (Entry) it.next();
      System.out.println(entry.getKey()+","+entry.getValue());
    }