gpt4 book ai didi

Java HashMap containsKey 奇怪的行为

转载 作者:行者123 更新时间:2023-12-03 20:25:19 26 4
gpt4 key购买 nike

尝试实现陷入奇怪问题的简单任务:

class User{
String login;
String pwrd;
User(String lg,String pw){
this.login=lg;
this.pwrd=pw;
}
public String toString(){
return this.login;
}
public boolean equals(String a){
return this.login.equals(a);
}
public boolean equals(User t){
return this.login.equals(t.toString());
}
}

public class Foo{
public static void main (String[] args)
{
HashMap<User,Boolean> a=new HashMap<>();
User a1=new User("asd","123"),a2=new User("asd","134");
a.put(a1,false);
a.put(a2,false);
System.out.println(a.containsKey(a2));
System.out.println(a.containsKey("asd"));
}
}

因此,我希望 containsKey 检查都为真。在代码中,它会被越来越多地使用。因此,首先要了解它为什么会这样,并在可能的情况下修复它。任何帮助表示赞赏。

最佳答案

Map 的键是 User 实例,所以 a.containsKey("asd") 永远不会返回 true,因为 "asd "是一个字符串。

顺便说一句,您没有覆盖Objectequals,它需要一个Object 参数。这意味着 a.containsKey(a2) 也返回 false,因为 a1==a2 为 false。

equals 的正确实现应该是:

@Override
public boolean equals(Object other){
if (!(other instanceof User))
return false;
User u = (User) other;
return this.login.equals(u.login);
}

正如 Andy 提到的,您还必须覆盖 hashCode,这样如果 a.equals(b) 为真,则 a.hashCode()==b .hashCode().

编辑:

我认为如果您以处理 String 实例的方式覆盖 equals,您可以使 a.containsKey("asd") 返回 true如果它们与 login 属性匹配,则与您的 User 实例相同:

@Override
public boolean equals(Object other){
if (other instanceof User) {
User u = (User) other;
return this.login.equals(u.login);
} else if (other instanceof String) {
String u = (String) other;
return this.login.equals(u);
}
return false;
}

@Override
public int hashCode()
{
return login.hashCode();
}

我从未尝试过这样的 equals 实现,但根据我对 HashMap 的理解,它可能会起作用。

但是,equals 的这种实现将违反 Object 的 Javadoc 中定义的 equals 契约,因为 "asd".equals(a1) 将返回 false,即使 a1.equals("asd") 为真。

编辑:

在检查了HashMap的实现之后,我发现这个equals的实现是行不通的,因为containsKey(key)的代码将键与现有条目的键进行比较,而不是相反,如果 obj 不是 ,则 String.equals(obj) 将始终返回 false字符串。我想有充分的理由不违反 equals 的约定。

关于Java HashMap containsKey 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34067538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com