关于equals和hashCode与==的问题

Acllies 2009-11-13 01:13:27
//根据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分辨不清楚各自的用处。
谢谢!~~~
...全文
138 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
haikuan505 2009-11-13
  • 打赏
  • 举报
回复
顶!~~~~~~~~~~~
jsjw18 2009-11-13
  • 打赏
  • 举报
回复
还有一点值得一提的是:HashMap中的匿名内部类很好用的,可以使用entrySet()访问到它的Entry这个方法遍历,比那个keySet效率要高很多。
Iterator it = map.entrySet().iterator();
while(it.hasNext())
{
Entry entry = (Entry) it.next();
System.out.println(entry.getKey()+","+entry.getValue());
}
smallbear923 2009-11-13
  • 打赏
  • 举报
回复
顶下~
wj84507657 2009-11-13
  • 打赏
  • 举报
回复
试试就可以了。。。放到代码你运行看看。。。。。
jsjw18 2009-11-13
  • 打赏
  • 举报
回复
equals是Object里面的方法,是比较两个对象的地址是否相等,如果重写了equals方法,那么判断规则是根据你重写的规则来的,一般equals判断相等的对象,它们的hashCode值也相等,反过来就不一定了,而==是比较地址值是否相等(其实地址相等就意味着值也相等),一般==只用于基本类型和相同类型的包装类的比较,在对象比较中有一个特殊的可以用==,那就是对象和null进行相等比较。
在遍历HashMap的时候,最好是判空一下,因为它的键或值可以为null,Hashtable就没有这样的问题。
木木水夕 2009-11-13
  • 打赏
  • 举报
回复
equals 本身是object类里的一个方法,他原本是比较地址是否相等的,也就是判断两个对象是否是同一个对象,但是String类重写了该方法,让该方法只判断值相等就可以了。其实你也可以写一个类自己重写这个方法的。
Acllies 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wifewifewife 的回复:]
equals表示两个数值相等就可以,地址可以不相等,
==表示数值和地址都要相等.
如果a.equals(b),那么a.hashcode==b.hashcode
反过来则不行.a.hashcode==b.hashcode,不一定a.equals(b)
hashcode是散列码

[/Quote]
既然是这样,那是不是(1)处的前面一半的判断条件可以不要了,(2)处的后面一半的判断条件也不需要了呢?
wifewifewife 2009-11-13
  • 打赏
  • 举报
回复
equals表示两个数值相等就可以,地址可以不相等,
==表示数值和地址都要相等.
如果a.equals(b),那么a.hashcode==b.hashcode
反过来则不行.a.hashcode==b.hashcode,不一定a.equals(b)
hashcode是散列码
wifewifewife 2009-11-13
  • 打赏
  • 举报
回复

if(get(key).equals(val) && get(key) == val)
{
return key;
}

equals表示两个数值相等就可以,地址可以不相等,==表示数值和地址都要相等.
AldisZhan 2009-11-13
  • 打赏
  • 举报
回复
hashCode与equals()规则可以看看我的博客 呵呵有点广告嫌疑
http://blog.csdn.net/KindAzrael/archive/2009/10/05/4633615.aspx


if(get(key).equals(val) && get(key) == val) (1)
{
return key;
}
// 这是哪儿的代码

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧