为什么Set允许重复的Byte Integer和Long值

时间:2016-02-14 07:45:19

标签: java set

因为我的知识集基本上有两个方法equals()和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]

3 个答案:

答案 0 :(得分:7)

Long实例永远不能等于Integer实例,它永远不能等于Byte实例,即使它们都具有相同的数值。您放入Set的3个实例彼此不相等。

例如,请参阅Integer的{​​{1}}:

equals

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

答案 1 :(得分:2)

以下是Integer.equals(Object) null所说的内容:

  

将此对象与指定对象进行比较。结果为true 当且仅当参数不是Integer 并且是Integer对象时,它包含与此对象相同的int值。

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

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

不幸的是,如果您使用TreeSet或任何其他标准的基于Java哈希表的类以及标准包装类,则没有解决方法。

然而:

  • 如果您使用Comparator或类似内容,则可以使用自定义<div class="top-nav"> <div class="container"> <span class="menu"> </span> <ul> <li class="active"><a href="index.php?page=home">Home<span> </span></a></li> <li><a href="index.php?page=collections">Collections<span> </span></a></li> <li><a href="index.php?page=404">New Arrivals<span> </span></a></li> <li><a href="index.php?page=404">Sale<span> </span></a></li> <li><a href="index.php?page=404">Accessories<span> </span></a></li> <li><a href="index.php?page=about">About Us<span> </span></a></li> <li><a href="index.php?page=contact">Contact Us<span> </span></a></li> <div class="clearfix"> </div> </ul> </div> </div> 对象解决此问题。

  • Guava中有一个替代的哈希表实现,允许您提供外部equals和hashCode实现。

  • 您可以为标准类创建自己的包装类,其中包含equals和hashcode的不同语义。不幸的是,这些不会与其他东西互操作;例如Java自动装箱/自动拆箱。

答案 2 :(得分:1)

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

重复值是具有相同类型的值,具有相同的hashCode()并在比较时返回TreeSet。不同类型的对象(在你的情况下是Byte和Long)在这些术语中是不相等的。

如果您希望将不同数字类型的值放入设置并享受跨类型行为,则可以将Comparator与仅用于比较的自定义class Business < ActiveRecord::Base ## OWNERS / EMPLOYEES has_many :business_users, as: :business, dependent: :destroy has_many :users, through: :business_users accepts_nested_attributes_for :business_users, allow_destroy: true, reject_if: lambda { |a| a[:user_id].blank? || a[:role].blank? } end 一起使用没有考虑到这种类型。