首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Set允许重复Byte和长值

为什么Set允许重复Byte和长值
EN

Stack Overflow用户
提问于 2016-02-14 07:45:19
回答 3查看 529关注 0票数 2

由于我的知识集基本上有两个方法等于()和hashcode(),基于这两个方法确定值是相等的,并且避免重复条目,但是在我感到困惑的程序下面,即使包装类也有两个方法被重写,那么为什么它接受重复值呢?

代码:

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

发布于 2016-02-14 07:46:22

Long实例永远不能等于永远不能等于Byte实例的Integer实例,即使两者具有相同的数值。您在Set中放置的3个实例并不相等。

例如,参见Integerequals

代码语言:javascript
运行
复制
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

两个实例必须具有相同的类型才能彼此相等(一个必要条件)。

票数 7
EN

Stack Overflow用户

发布于 2016-02-14 07:52:13

以下是javadoc for Integer.equals(Object)的意思:

将此对象与指定的对象进行比较。如果并且只有当参数不是null 并且是包含与此对象相同的int值的对象时,结果才是真。

换句话说,Integer对象不能等同于也不是Integer对象的对象。这同样适用于所有的原始包装类。

因此,根据HashSet的语义,示例中的这4个对象是不相等的,因此也不是重复的。

不幸的是,如果您使用的是HashSet或任何其他基于Java的标准类,以及标准包装类,则无法解决这一问题。

然而:

  • 如果要使用TreeSet或类似的方法,可以使用自定义Comparator对象来解决此问题。
  • Guava中有一个替代哈希表实现,允许您提供外部等于和hashCode实现。
  • 您可以为equals和hashcode创建与标准类具有不同语义的自己的包装类。不幸的是,它们不能与其他事物进行互操作,例如Java自动装箱/自动取消装箱。
票数 2
EN

Stack Overflow用户

发布于 2016-02-14 07:50:45

Set不允许重复值。这里的问题是什么是重复,什么不是。

重复值是相同类型的值,具有相同的hashCode(),并在比较时返回true。在这些术语中,不同类型的对象(在您的例子中是Byte和Long)并不相等。

但是,如果您希望将不同数值类型的值放到Set中并享受跨类型行为,则可以将TreeSet与您的自定义Comparator一起使用,它只对值进行比较,而不考虑类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35389509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档