- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试实现陷入奇怪问题的简单任务:
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 "是一个字符串。
顺便说一句,您没有覆盖Object
的equals
,它需要一个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/
java.util.Map.containsKey(Object key)文件说: @throws ClassCastException if the key is of an inappropria
我正在为大学类(class)实现一个 Web 项目,该项目使用 struts2,当我运行该项目时,它会在 containsKey() 中阻塞。它不打印任何字符串。 这是我遇到问题的一些代码: pack
我的字典的 ContainsKey() 方法不起作用 - 我如何“覆盖 GetHashCode()”以使其起作用? 最佳答案 您必须同时覆盖 GetHashCode()和 Equals()来表示等价。
我正在尝试将超链接存储为 map 中的键,我正在使用 multimap private Map> record=new HashMap>(); 我正在使用以下方法检查超链接是否已经存在于 map 中
好的,我需要一点帮助。我有一本通用词典“cashdata”。这个字典的键是对象(查询对象,我定义的一个类)。查询对象有“Terms”字段,它是一个字符串列表,和一个“Operator”字段,它是一个枚
我在用 gradle 构建我的 Android 项目时遇到了这个错误。它大约每周发生一次。 FAILURE: Build failed with an exception. * What went w
尝试实现陷入奇怪问题的简单任务: class User{ String login; String pwrd; User(String lg,String pw){
使用此代码时出现崩溃: if (!savedInstanceState.containsKey("mybool")) { // my code } 我的onCreate(): @Overri
我正在用 java 编写 HashMap 的实现,但在 containsKey 方法中查找正确的存储桶时遇到了一些问题 public class MyHashMap { LinkedList[] ta
构造函数接受两个数组,我想将它们放入我的 HashMap 中,但如果映射已经包含其中一个数组中的单词,那么我想抛出异常。除非重复项是数组项中的最后一项,否则这种方法有效。为什么会发生这种情况? pri
程序将根据If语句打印不正确的键和值。有人能解释一下为什么吗? 例如键 = 汤姆叔叔 + 值 = 02086542222 键 = Harry + 值 = 020826262 查询=汤姆叔叔 返回 =
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试将位置列表中的所有唯一坐标添加到单个 HashMap 中,该 HashMap 将坐标作为键,将计数作为值。关键是由“$”符号连接的经度和纬度。 //String = coordinates
This question already has answers here: Java HashMap containsKey returns false for existing object (
这个问题已经有答案了: What is the Java ?: operator called and what does it do? (17 个回答) Can Java's ternary/con
我基本上是在尝试将一些组织的 ID 和名称缓存在字典中。我不断收到错误消息:Item with Same Key has already been added。这对我来说很奇怪,因为第一个 if bl
我正在为一个使用家庭概念的应用程序创建一个插件。每个 Family 都属于一个 FamilyCategory,每个 Family 都包含 FamilySymbols。像这样的漂亮树结构: 家庭类别(门
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我对 Java 很陌生。尝试访问
这是我的代码: import java.util.HashMap; class MyString { String string; MyString(String string) {
请解释字典的'getAt'方法失败的原因 List infoKeys = new List(infoDict.Keys); if (infoKeys.Contains(TorrentFileKeyWo
我是一名优秀的程序员,十分优秀!