由于我的知识集基本上有两个方法等于()和hashcode(),基于这两个方法确定值是相等的,并且避免重复条目,但是在我感到困惑的程序下面,即使包装类也有两个方法被重写,那么为什么它接受重复值呢?
代码:
Collection col=new LinkedHashSet();
col.add(new Long(65));
col.add(new Byte((byte) 65));
col.add(new Integer(65));
col.add("A");
System.out.println(col);答: 65, 65,65,A,但我期望65,A
发布于 2016-02-14 07:46:22
Long实例永远不能等于永远不能等于Byte实例的Integer实例,即使两者具有相同的数值。您在Set中放置的3个实例并不相等。
例如,参见Integer的equals:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}两个实例必须具有相同的类型才能彼此相等(一个必要条件)。
发布于 2016-02-14 07:52:13
以下是javadoc for Integer.equals(Object)的意思:
将此对象与指定的对象进行比较。如果并且只有当参数不是
null并且是包含与此对象相同的int值的对象时,结果才是真。
换句话说,Integer对象不能等同于也不是Integer对象的对象。这同样适用于所有的原始包装类。
因此,根据HashSet的语义,示例中的这4个对象是不相等的,因此也不是重复的。
不幸的是,如果您使用的是HashSet或任何其他基于Java的标准类,以及标准包装类,则无法解决这一问题。
然而:
TreeSet或类似的方法,可以使用自定义Comparator对象来解决此问题。发布于 2016-02-14 07:50:45
Set不允许重复值。这里的问题是什么是重复,什么不是。
重复值是相同类型的值,具有相同的hashCode(),并在比较时返回true。在这些术语中,不同类型的对象(在您的例子中是Byte和Long)并不相等。
但是,如果您希望将不同数值类型的值放到Set中并享受跨类型行为,则可以将TreeSet与您的自定义Comparator一起使用,它只对值进行比较,而不考虑类型。
https://stackoverflow.com/questions/35389509
复制相似问题