Java集合框架总图
Set接口和具体实现类
Set接口继承Collection,集合元素不重复。与List一样,它同样允许null存在但仅可有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同。
注:关于重复性问题,Set接口中的不重复是有特殊要求的。
两个不同的对象A和B,正常情况下是能够放入到Set里面的,但如果A和B都重写了hashcode和equals方法,且重写后的hashcode和equals方法是相同的,那么A和B不能同时放入到Set集合中去,这也就验证了Set集合中的去重和hashcode、equals方法直接相关。
List基本上都以Array为基础,Set则在HashMap基础上来实现。
一、HashSet
1、继承关系
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
2、重点
(1)HashSet是一个没有重复元素的集合,且允许null。
HashSet由HashMap实现,不保证元素的顺序,即元素插入的顺序与输出的顺序不一致。
(2)HashSet是非同步的。
(3)HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能。
3、实现方式
通过HashMap存储元素,元素存放在HashMap的Key中,而Value统一使用一个Object对象。
4、易错点
(1)关于HashSet中存放null值
HashSet中允许存入null值,但在HashSet中只能够存入一个null值。
(2)HashSet中存储元素的位置是固定的
HashSet底层基于Hash算法实现,使用了hashcode,所以HashSet中相应元素的位置是固定的。
二、LinkedHashSet
1、继承关系
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable
2、构造方法
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
public LinkedHashSet() {
super(16, .75f, true);
}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
}
LinkedHashSet底层是基于LinkedHashMap实现。
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//dummy用来区别创建的是HashMap还是LinkedHashMap
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
注:当前HashSet构造函数不能被直接调用。
3、重点
(1)LinkedHashSet继承自HashSet,底层基于LinkedHashMap实现。
(2)LinkedHashSet非同步。
(3)LinkedHashSet有序,根据元素的hashCode值决定元素的存储位置,同时使用链表维护元素的次序,因此当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
4、适用场景
由于HashSet是无序的,为了使哈希表在某种需求需要有序时使用,数据插入有一定顺序且不重复。
三、TreeSet
1、继承关系
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
2、构造方法
//默认的构造函数,使用该构造函数,TreeSet中的元素使用自然排序。
public TreeSet() {
this(new TreeMap<E,Object>());
}
//创建的TreeSet包含collection
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
//指定TreeSet的比较器
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
//创建的TreeSet包含set
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
3、重点
(1)插入无序,按顺序输出,不可为null,不可重复。
(2)TreeSet是一个包含有序的且没有重复元素的集合,底层基于TreeMap实现。
(3)TreeSet中含有一个NavigableMap类型的成员变量m(m实际上是TreeMap的实例)。
(4)TreeSet非线程安全。
(5)TreeSet支持两种排序方式,自然排序(默认的排序方式)和定制排序。
当构造TreeSet时,若使用不带参数的构造函数,则TreeSet的使用自然比较器。若需要使用自定义的比较器,则需要使用带比较器的参数。
注:TreeSet集合不通过hashcode和equals函数来比较元素,而是通过compare或comparaeTo函数来判断。compare函数通过判断两个对象的id,相同的id判断为重复元素而不被加入。
4、适用场景
需要按特定顺序排序且不重复。