Java hashCode有疑问
我有这个程序:
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
版本,并且此版本始终为每个对象返回不同的哈希码,因此添加的两个测试对象将被视为不同。
没有找到相关结果
已邀请:
4 个回复
锑寝粒
,而是
方法。 HashSet仍然是Set,其语义不允许重复。使用
方法检查重复项,如果是String,则返回
但是对于你的
类
方法没有定义,它将使用
的默认实现,只有当两个引用都是同一个实例时才会返回true。 方法
不用于检查对象是否应该被视为相同,而是用于基于散列函数将它们分布在集合中的方法。绝对有可能对于两个对象,此方法将返回相同的值,而
将返回false。 附:
ѭѭ的实施并不保证价值的唯一性。使用简单的循环检查很容易。
珊畴炮贩号
中插入任何键时,它会检查是否有任何其他对象存在相同的哈希码,如果是,则检查
方法。如果两个对象相同,那么
将不会添加该键,而是用新值替换旧值。
呢率篓舍烫
,它是关于
方法。设置不允许重复。副本是对象在逻辑上相等的副本。 为了验证您可以尝试
如果对象相等,则一组只接受一个。
粳饶瓢部