【发布时间】:2014-06-03 13:10:26
【问题描述】:
我有两个对象“列表”,如果元素相等,我想比较它们。如果它们不相等,则循环应该将不相等的对象放入另一个列表中。非常简单。我的问题是:equals 方法没有按预期工作。
这是我的自定义 equals 方法的对象类:
public class Profil {
private String vorname;
private String name;
private String adLoginBenutzer;
public Profil() {
}
public String getAdLoginBenutzer() {
return adLoginBenutzer;
}
public void setAdLoginBenutzer(String adLoginBenutzer) {
this.adLoginBenutzer = adLoginBenutzer;
}
public String getVorname() {
return vorname;
}
public void setVorname(String vorname) {
this.vorname = vorname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
if (name == null || vorname == null) {
return "<keiner>";
}
return vorname + ", " + name + " " + adLoginBenutzer;
}
@Override
public boolean equals(Object obj) {
if (getClass() != obj.getClass()) {
return false;
}
Profil other = (Profil)obj;
if(!this.getVorname().equals(other.getVorname()) || !this.getName().equals(other.getName()) || !this.getAdLoginBenutzer().equals(other.getAdLoginBenutzer()))
{
return false;
}
return true;
}
}
这是循环:(注意:我基本上想将列表合并到一个组合框模型中,如果配置文件对象不等于它应该将它添加到组合框模型中的第一个位置)
public void putProfilesIntoCbx(HashSet<Profil> profile)
{
DefaultComboBoxModel<Profil> cbx = (DefaultComboBoxModel <Profil>)cbBearbeiter.getModel();
for(Profil p : profile)
{
for(int i = 0; i< cbx.getSize(); i++)
{
if(!p.equals(cbx.getElementAt(i)))
{
cbx.insertElementAt(p, 0);
}
}
}
cbBearbeiter.setModel(cbx);
}
我调试了代码并在 equals 方法的最后一个 if 处设置了断点。尽管存在相等的对象,但即使对象确实相等,最后一个 if 也会无缘无故地返回 false。即使我反转等于 if 语句,它也不起作用。
【问题讨论】:
-
要使哈希设置正常工作,您还需要覆盖
hashCode(),以便在对象“相等”时哈希相同 -
如果你覆盖了equals(),你也应该覆盖hashCode()
-
我不知道 hashCode() 方法。我应该在哪里实现这个方法,这个方法应该做什么?
-
阅读
Object的javadoc;一切都解释清楚了 -
如果你用java 7,看
Objects#hash(Object... objects)实现hashcode()(sample)
标签: java list loops combobox equals