因为我的知识集基本上有两个方法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]
答案 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
一起使用没有考虑到这种类型。