我使用了如下结构来从对象数组中获取唯一元素。
dataList.put(column, new LinkedList<Object>(new HashSet<Object>(Arrays.asList(entry.getValue()))));
来自entry.getValue()的数组是一个100个元素的数组,包含1到99之间的值,其中1个重复两次。
文档说Arrays.asList(arr[])
方法返回与数组长度相同的固定长度列表。
我观察到创建的集合还包含原始数组给出的重复值。
请解释一下这种行为。
更多细节。
我也尝试使用set.addAll(Arrays.asList(entry.getValue());
,其中set是HashSet并得到相同的结果。
entry.getValue()返回的数组是java.lang.Short类型的数组
答案 0 :(得分:2)
最有可能的是,您没有覆盖equals()
返回的数组中对象类中的entry.getValue()
。特别是因为您使用的是HashSet
,因此您应该覆盖hashCode()
,以便它与equals()
“同意”,符合javadoc of equals()
:
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。
如果您不覆盖equals()
,则每个实例都不会equal()
到任何其他实例,尽管它的“值”相同,因为这是equals()
的默认实现,因此Set
会将“1”对象视为“不同”。
答案 1 :(得分:0)
在使用各种数据类型的数组运行上面的代码片段后,我发现原始类型的数组存储为单个数组对象,而像String,Integer,Float等Java类的数组存储为它们的集合。元件。
在我的情况下,我有一个int []数组作为List传递给HashSet,它被作为单个Object而没有完成重复元素的过滤。当数组包含Integer对象时,HashSet可以过滤掉重复项。