Java Collection 之 Set

首先讲下Set的一些特性:
Set是Collecion的子接口,里面的元素不允许重复.每个具体的 Set 实现类依赖添加的对象的 equals()方法来检查独一性。Set接口没有引入新方法,所以Set就是一个Collection,只不过其行为不同。
如何界定是否是重复元素?Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足e1.equals(e2)==false.

其实Set与List的最大区别就是:Set是在Map的基础上的实现
看看HashSet

public HashSet(int initialCapacity) {
map = new HashMap(initialCapacity);
}

public boolean add(E o) {
return map.put(o, PRESENT)==null;
}

再看看TreeSet

public TreeSet() {
this(new TreeMap());
}
private TreeSet(SortedMap m) {
this.m = m;
keySet = m.keySet();
}


这也就是Set于Map中key的特性一样的原因...

---------------------------------------------

下面介绍Set接口3种主要的实现类。
HashSet 为快速查找而设计的Set。存入HashSet的元素必须定义hashCode()。
TreeSet 保存次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。元素必须实现Comparable接口。
LinkedHashSet 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入顺序)。在使用迭代器遍历Set时,结果会按插入的次序显示。元素必须定义hashCode()方法。

在查看springside原码的时候,看到domain类使用的是LinkedHashSet类
	private Set roles = new LinkedHashSet(0);


在POEAA中,有这样一段话:
[quote]
在使用集合的时候,在面向对象语言中,通常使用数组或者列表这样的有序集合,然而,在保存到关系数据库的时候想要维持一个绝对有序的集合是非常困难的,因此,有必要考虑使用无序集来存储集合.
[/quote]
所以在domain中,使用Set接口,而不使用List!
在Set中,可以使用HashSet!
当要使用@OrderBy时候,可以再使用LinkedHashSet,使之有顺序.

你可能感兴趣的:(J2SE)