这个Set和Hashset和List组合如何工作?

时间:2012-10-12 08:22:25

标签: java collections set hashset

任何人都可以向我解释这段代码,我对Collections没有太多编码经验,所以我很难理解这些LOC。

String[] stringList ={"1","2","1","1","2","3","2","3","2","1"}; 
List<String> al =Arrays.asList(stringList); 
Set<String> uniqueList = new HashSet<String>(al); 
for (String strCount :uniqueList) { 
     System.out.println(strCount + ": " + Collections.frequency(al, strCount)); 
} 

为什么此循环仅运行3次,而uniquelist包含stringList的所有成员。循环不应该运行10次(长度uniqueList)?

5 个答案:

答案 0 :(得分:12)

for循环只执行三次,因为stringList中只有3个不同的值。

Set不允许重复输入。 Set检查.equals()条目,对于两个重复条目,trueuniqueList。因此,"1"中只有三个元素,即:"2""3""2".equals("2")

请注意,truee1

这是javadoc最重要的部分:

  

不包含重复元素的集合。更正式地说,集合不包含e2e1.equals(e2)元素对,{{1}},最多只有一个null元素。

答案 1 :(得分:7)

SetCollection,不包含重复元素。由于您的数组仅包含1,2和3作为唯一元素,因此您的集合将仅包含3个元素。

请查看此文档link

答案 2 :(得分:4)

  

为什么这个循环只运行3次而“uniquelist”拥有所有成员   of“StringList”

不,不

如果您使用Mathematical的一般 Set 定义,则设置unique值的集合。他们不能重复。

在Java中也是如此(实际上在任何地方),因此当您将List转换为Set时,所有Duplicate值都为filtered out。仅保留unique个值。

答案 3 :(得分:4)

根据java spec

在HashSet实现中添加方法:

  

public boolean add(E e)

     

如果指定的元素尚不存在,则将其添加到此集合中。   更正式地说,如果设置,则将指定的元素e添加到此集合中   不包含元素e2(e == null?e2 == null:e.equals(e2))。   如果此集合已包含该元素,则该调用将离开该集合   不变并返回false。

答案 4 :(得分:4)

Set<String> uniqueList = new HashSet<String>(al); 

由于Set不允许重复,因此在执行此语句之后 uniqueList包含"1""2""3"元素。