我有这个程序:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是作业.我们今天早些时候在测验中被问到了这个问题.我知道答案,但试图理解为什么会这样.
上面的程序给出3作为输出.
任何人都可以解释为什么会这样吗?
我想(不确定):
的java.lang.String类覆盖了hashCode从方法java.lang.Object.因此String,值为"foo" 的对象将被视为重复.测试类不会覆盖该hashCode方法并最终使用该java.lang.Object版本,并且此版本始终为每个对象返回不同的哈希码,因此添加的两个测试对象将被视为不同.
在这种情况下,它不是hashCode()关于equals()方法而是关于方法.HashSet仍然是Set,其语义不允许重复.使用equals()方法检查重复项,在String的情况下将返回true
但是,对于您的test类equals()方法没有定义,它将使用默认实现,Object只有当两个引用都是同一个实例时才会返回true.
方法hashCode()用于不检查对象是否应被视为相同,而是用于基于散列函数将它们分布在集合中的方式.绝对有可能对于两个对象,此方法将返回相同的值,同时equals()返回false.
PS的hashCode实现Object并不能保证值的唯一性.使用简单的循环检查很容易.
| 归档时间: |
|
| 查看次数: |
329 次 |
| 最近记录: |