- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这个程序:
import java.util.*;
public class test {
private String s;
public test(String s) { this.s = s; }
public static void main(String[] args) {
HashSet<Object> hs = new HashSet<Object>();
test ws1 = new test("foo");
test ws2 = new test("foo");
String s1 = new String("foo");
String s2 = new String("foo");
hs.add(ws1);
hs.add(ws2);
hs.add(s1);
hs.add(s2); // removing this line also gives same output.
System.out.println(hs.size());
}
}
请注意,这不是作业。我们今天早些时候在测验中被问到这个问题。我知道答案,但试图理解为什么会这样。
上面的程序给出了 3 作为输出。
谁能解释一下这是为什么?
我认为(不确定):
java.lang.String
类覆盖了 java.lang.Object
中的 hashCode
方法。因此,值为“foo”的 String
对象将被视为重复项。测试类没有覆盖 hashCode
方法并最终使用 java.lang.Object
版本并且这个版本总是为每个对象返回不同的哈希码,所以这两个测试添加的对象被视为不同。
最佳答案
在这种情况下,它与hashCode()
无关,而是与equals()
方法有关。 HashSet 仍然是 Set,具有不允许重复的语义。使用 equals()
方法检查重复项,如果是 String 将返回 true
然而,对于您的test
类,equals()
方法没有定义,它将使用Object
的默认实现,它只会返回true当两个引用都指向同一个实例时。
方法 hashCode()
不是用来检查对象是否应该被视为相同的,而是作为一种基于散列函数将它们分布在集合中的方法。对于两个对象,此方法绝对有可能返回相同的值,而 equals()
将返回 false。
附言Object
的hashCode
实现不保证值的唯一性。使用简单的循环很容易检查。
关于java hashCode疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5630609/
我有以下变量: string str1 = "1"; string str2 = "asd"; string str3 = "3.5"; string str4 = "a"; 现在我需要找到每个字符串
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭 8 年前。 public class progr
我对这种行为有些疑惑。谁能解释一下 void Decrement(int* x){ *x--; //using this line, the output is 5
您好 StackOverflow 用户(或 Stackoverflowers?): 我正在通过编写 WPF 代码来学习。我阅读了几篇文章/看到了几个截屏视频,并且来自 WEB 开发背景,我启动了 VS
在阅读 HTML5 IndexedDB Specification 时我对它的异步请求模型有些怀疑。查看 request api example 时, open 方法用于启动异步请求。 var req
有几个问题,首先是这个方法,它将 int[] 转换为 byte[]: public static byte[] intToByte(int[] input){ ByteBuffer byteB
我是一名优秀的程序员,十分优秀!