从存储重复元素的Arrays.asList创建的集合

时间:2014-01-25 11:45:48

标签: java arrays list collections set

我使用了如下结构来从对象数组中获取唯一元素。

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类型的数组

2 个答案:

答案 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可以过滤掉重复项。