关于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分辨不清楚各自的用处。
谢谢!~~~
...全文
160 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表示两个数值相等就可以,地址可以不相等,==表示数值和地址都要相等.
HelloAldis 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;
}
// 这是哪儿的代码

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。

62,628

社区成员

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

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