我期望以下内容返回 true。
public class HudsonJob {
private String name;
private String status;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public boolean equals(Object jobName) {
return name.toLowerCase().equals(((String)jobName).toLowerCase());
}
public int hashCode() {
return name.hashCode();
}
}
,
List<HudsonJob> existingJbsLst = hudsonUtil.getAllJobs(); // returns multiple HudsonJob objects in the list.
我期望返回 true 的语句是:
boolean isExistingJob=existingJbsLst.contains("AnExistingJOB");
总是返回 false。
或
boolean isExistingJob = ExistingJbsLst.equals("AnExistingJOB");
也返回 false。
我应该在代码中添加/更改什么才能获得预期的返回值。
最佳答案
你刹车the contract对于 equals
方法。例如:
它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
在您的情况下, job.equals(string)
可能为 true,但 string.equals(job)
将始终为 false。
列表中可能发生的情况是元素以另一种方式进行比较:
for (Object el : list) {
if (parameter.equals(el)) {
...
}
}
这就是它不起作用的技术原因:"AnExistingJOB".equals(jobObject)
始终为 false。
编辑
顺便说一句,您的 hashCode
方法也是错误的。如果在 equals
方法中比较时忽略大小写,那么在 hashCode
中也忽略它。 Bozho 的建议可能是个好建议:IDE 会更好地生成这些方法。此外,您还可以检查 Andreas_D 的答案以了解有效的实现。
关于java - 对象列表与字符串值比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863930/